2015-07-13 1 views
1

Когда я пытаюсь сохранить изображение на некоторых устройствах, приложение вылетает. После некоторого исследования я думаю, что проблема в ImageRoot, но я потерял столько решений ... Я думаю, что проблема заключается в получении внешнего пути хранения. Устройство, которое я использую для тестирования моего приложения, не имеет никакой SD-карты, путь /mnt/sdcard/Pictures и изображение успешно сохраняется. Я хочу, чтобы это работало, имеет ли телефон SD-карту или нет. Спасибо за любую помощь заранее.Android: лучший способ сохранить изображение на внешнем носителе

imageRoot=new File(Environment.getExternalStoragePublicDirectory(
      Environment.DIRECTORY_PICTURES), "AppName"); 

private void saveImage() { 


     Bitmap bitmap = sqimage.getDrawingCache(); 
     File image = new File(imageRoot, imageName); 



     if (image.exists()) { 
      image.delete(); 

     } 

     try { 
      FileOutputStream output = new FileOutputStream(image); 
      bitmap.compress(Bitmap.CompressFormat.JPEG, 100, output); 
      output.flush(); 
      output.close(); 
      new SingleMediaFileConnector(getActivity().getApplicationContext(), image); 

     } catch (FileNotFoundException e) { 
      e.printStackTrace(); 
      success = false; 
     } catch (IOException e) { 
      e.printStackTrace(); 
      success = false; 
     } 
    } 
+0

журналы LogCat, пожалуйста –

+0

я не журналы, когда приложение падает, потому что это не мое устройство и приложение является установленный с .apk без андроидной студии. –

+0

Вы можете получить журналы с помощью команды adb. Используйте 'abd logcat -d> FileName.txt', чтобы выталкивать журналы сбоя в txt-файл –

ответ

1

Иногда getExternalStoragePublicDirectory пути не существует. Вам нужно проверить его существование.

try { 
    imageRoot=new File(Environment.getExternalStoragePublicDirectory(
     Environment.DIRECTORY_PICTURES), "AppName"); 
    File image = new File(imageRoot, imageName); 

    // Make sure the Pictures directory exists. 
    imageRoot.mkdirs(); 

    // Other stuffs here 

} catch (IOException e) { 
    // Unable to create file, likely because external storage is 
    // not currently mounted. 
    Log.w("ExternalStorage", "Error writing " + file, e); 
} 

Для получения более подробной информации, см. here.

[Редактировать]
Альтернативный способ можно использовать:

getExternalFilesDir(Environment.DIRECTORY_PICTURES); 
+0

. Я делаю правильную проверку, существует ли путь. if (! ImageRoot.exists()) {imageRoot.mkdirs();} –

+0

Возможно, ваше приложение может быть повреждено в момент создания 'imageRoot'. Поместите это внутри блока catch catch и проверьте, есть ли там исключение –