2015-05-27 2 views
1

Когда мое приложение запускается первым, оно позволяет пользователю выбрать изображение профиля. Это можно сделать, сделав фотографию на данный момент, или выбрав ее в галерее.Сохранить растровое изображение в папке приложения

После того, как пользователь получит снимок, его необходимо сохранить во внутренней памяти устройства и использовать в приложении как изображение профиля пользователя.

Этот процесс работает нормально, пользователь получает изображение, и это отображается в представлении изображения до его сохранения. Но чтобы сохранить изображение во внутреннем хранилище, у меня проблемы. Я попробовал несколько способов сделать это, и большинство из них, похоже, работают. Но когда я их пытаюсь, изображение не сохраняется или, по крайней мере, я не нахожу папку, в которой она сохраняется.

Я попытался в этих 3 способами:

Первое:

File directory = getDir("profile", Context.MODE_PRIVATE); 
File mypath = new File(directory, "thumbnail.png"); 

FileOutputStream fos = null; 
try { 
    fos = new FileOutputStream(mypath); 
    mybitmap.compress(Bitmap.CompressFormat.PNG, 100, fos); 
    fos.close(); 
} catch (Exception e) { 
    e.printStackTrace(); 
} 

Второе:

ByteArrayOutputStream bytes = new ByteArrayOutputStream(); 
mybitmap.compress(Bitmap.CompressFormat.PNG, 90, bytes); 

FileOutputStream fos = null; 
try { 
    fos = openFileOutput("thumbnail.png", Context.MODE_PRIVATE); 
    fos.write(bytes.toByteArray()); 
    fos.close(); 
} catch (FileNotFoundException e) { 
    e.printStackTrace(); 
} catch (IOException e) { 
    e.printStackTrace(); 
} 

Третье:

ByteArrayOutputStream bytes = new ByteArrayOutputStream(); 
mybitmap.compress(Bitmap.CompressFormat.PNG, 90, bytes); 

File fileWithinMyDir = new File(getFilesDir(), "thumbnail.png"); 
try { 
    FileOutputStream fos = new FileOutputStream(fileWithinMyDir); 
    fos.write(bytes.toByteArray()); 
    fos.close(); 
} catch (FileNotFoundException e) { 
    e.printStackTrace(); 
} catch (IOException e) { 
    e.printStackTrace(); 
} 

Suposedly, изображение будет сохранено в путь: android/data/AppName/app_data/, но там нет папки. Во всяком случае, я смотрел в других папках, но ничего.

Edit-

В первом методе, я видел, что бросает исключение:

E/SAVE_IMAGE﹕ /data/data/com.example.myapp/app_profile/thumbnail.png: open failed: EISDIR (Is a directory) 
java.io.FileNotFoundException: /data/data/com.example.myapp/app_profile/thumbnail.png: open failed: EISDIR (Is a directory) 
Caused by: libcore.io.ErrnoException: open failed: EISDIR (Is a directory) 
+0

У вас есть разрешение на использование внешнего хранилища? –

+1

@quicklearner Мне не нужно писать на внешнем хранилище – masmic

ответ

2

Перепробовав несколько вещей, это то, что, наконец, работал для меня:

ContextWrapper cw = new ContextWrapper(getApplicationContext()); 
File directory = cw.getDir("profile", Context.MODE_PRIVATE); 
if (!directory.exists()) { 
    directory.mkdir(); 
} 
File mypath = new File(directory, "thumbnail.png"); 

FileOutputStream fos = null; 
try { 
    fos = new FileOutputStream(mypath); 
    resizedbitmap.compress(Bitmap.CompressFormat.PNG, 100, fos); 
    fos.close(); 
} catch (Exception e) { 
    Log.e("SAVE_IMAGE", e.getMessage(), e); 
} 

В основном то, чтобы проверить, существует ли каталог (а не файл), и если нет, создайте его с помощью mkdir().

+0

'Context # getDir()' создает папку, если она не существует, поэтому вызов 'mkdir()' избыточен (источник: документация Context.java) – Jeffrey

0

Ну, вам нужно создать папку, если она не существует.

попробуйте запустить этот код и посмотреть, если это исправляет проблему:

File parentDestination = saveFile.getParentFile(); 
    if (!parentDestination.exists()) { 
     parentDestination.mkdirs(); //make all the directory structures needed 
    } 
+0

Не работает даже этот способ – masmic

+0

У вас есть права на запись в манифесте? – JozeRi

+0

JozeRi

0

Попробуйте это ...

Вы должны использовать метод Bitmap.compress() для сохранения растрового изображения в виде файла. Он сжимает (если используемый формат позволяет) изображение и вставляет его в OutputStream.

Ниже приведен пример Bitmap экземпляра, полученного посредством getImageBitmap (myurl), который может быть сжат в формате JPEG с коэффициентом сжатия 85%:

String path = Environment.getExternalStorageDirectory().toString(); 
OutputStream fOut = null; 
File file = new File(path, "FitnessGirl"+Contador+".jpg"); // the File to save to 
fOut = new FileOutputStream(file); 

Bitmap pictureBitmap = getImageBitmap(myurl); // obtaining the Bitmap 
pictureBitmap.compress(Bitmap.CompressFormat.JPEG, 85, fOut); // saving the Bitmap to a file compressed as a JPEG with 85% compression rate 
fOut.flush(); 
fOut.close(); // do not forget to close the stream 

MediaStore.Images.Media.insertImage(getContentResolver(),file.getAbsolutePath(),file.getName(),file.getName()); 
+0

ваш путь относится к внешнему хранилищу, и мне нужно его сохранить во внутреннем хранилище. – masmic

0

понимаю ваше требование. Ниже вставляем часть кода, который я тестировал и работаю. В основном получайте изображение с камеры и сохраняйте его в приложении storage.please. Надеюсь, что это helps.Cheers ..

// Для сохранения изображения ...

private String saveToInternalSorage(Bitmap bitmapImage) { 
    ContextWrapper cw = new ContextWrapper(getApplicationContext()); 
    File directory = cw.getDir("imageDir", Context.MODE_PRIVATE); 
    // Create imageDir 
    File mypath = new File(directory, "profile.jpg"); 

    FileOutputStream fos = null; 
    try { 

     fos = new FileOutputStream(mypath); 

     // Use the compress method on the BitMap object to write image to 
     // the OutputStream 
     bitmapImage.compress(Bitmap.CompressFormat.PNG, 100, fos); 
     fos.close(); 
     Editor editor = sharedpreferences.edit(); 
     editor.putString("saved", "na"); 
     editor.commit(); 

    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
    return directory.getAbsolutePath(); 
} 

// ..Для того, чтобы загрузить изображение из памяти

private void loadImageFromStorage(String path) { 

    try { 
     ContextWrapper cw = new ContextWrapper(getApplicationContext()); 
     File path1 = cw.getDir("imageDir", Context.MODE_PRIVATE); 
     File f = new File(path1, "profile.jpg"); 
     Bitmap b = BitmapFactory.decodeStream(new FileInputStream(f)); 
     ImageView img = (ImageView) findViewById(R.id.viewImage); 
     img.setImageBitmap(b); 
    } catch (FileNotFoundException e) { 
     e.printStackTrace(); 
    } 

} 
+0

Если у вас есть взгляд на мой код, то первый метод, который я использовал – masmic

+0

, мог бы указать, как вы создали экземпляр sharedpreferences в порядке получить доступ к его методу редактирования? – channae

Смежные вопросы