2015-06-09 2 views
1

Недавно я реализовал Crashlytics и прохожу через настоящий рог изобилия аварийных журналов. Меня озадачило. В журнале показано, что я не мог открыть файл для потоковой передачи (в частности, написать фотографию JPG, которую я взял), однако в одной строке до этого я (верю), я ее успешно создал. Исключение (s) из Crashlytics:FileNotFoundException после файла, созданного для вывода потока

Non-fatal Exception: java.io.FileNotFoundException 
/storage/emulated/0/mycompany/9311ebcb-4dd5-493c-8fbd-46b242d4991d/b9a9a18e-0cd9-468d-83f3-7466b65485f7.jpg: open failed: ENOENT (No such file or directory) 
raw 
libcore.io.IoBridge.open (IoBridge.java:409) 
java.io.FileOutputStream.<init> (FileOutputStream.java:73) 
com.invocore.mycompany.utility.Utilities.saveImageJPEG (Utilities.java:698) 
com.invocore.mycompany.utility.Utilities.saveImageJPEG (Utilities.java:685) 
com.invocore.mycompany.utility.Utilities.saveImage (Utilities.java:634) 
com.invocore.mycompany.CameraCaptureActivity.savePhoto (CameraCaptureActivity.java:338) 
com.invocore.mycompany.CameraCaptureActivity.access$300 (CameraCaptureActivity.java:39) 
com.invocore.mycompany.CameraCaptureActivity$SaveTask.doInBackground (CameraCaptureActivity.java:266) 
com.invocore.mycompany.CameraCaptureActivity$SaveTask.doInBackground (CameraCaptureActivity.java:246) 
android.os.AsyncTask$2.call (AsyncTask.java:288) 
java.lang.Thread.run (Thread.java:841) 
Caused by libcore.io.ErrnoException 
libcore.io.Posix.open (Posix.java) 
java.io.FileOutputStream.<init> (FileOutputStream.java:73) 
com.invocore.mycompany.utility.Utilities.saveImageJPEG (Utilities.java:698) 
com.invocore.mycompany.utility.Utilities.saveImageJPEG (Utilities.java:685) 
com.invocore.mycompany.utility.Utilities.saveImage (Utilities.java:634) 
com.invocore.mycompany.CameraCaptureActivity.savePhoto (CameraCaptureActivity.java:338) 
com.invocore.mycompany.CameraCaptureActivity.access$300 (CameraCaptureActivity.java:39) 
com.invocore.mycompany.CameraCaptureActivity$SaveTask.doInBackground (CameraCaptureActivity.java:266) 
com.invocore.mycompany.CameraCaptureActivity$SaveTask.doInBackground (CameraCaptureActivity.java:246) 
android.os.AsyncTask$2.call (AsyncTask.java:288) 
java.lang.Thread.run (Thread.java:841) 

Вот исходный код:

public static void saveImageJPEG(Bitmap image, int width, int height, String filename, String directory, int quality) 
{ 
    Bitmap scaled = Bitmap.createScaledBitmap(image, width, height, true); 
    OutputStream outStream = null; 
    // Only add extension if we need to 
    if (!filename.toLowerCase().endsWith(".jpg")) { 
     filename = filename + ".jpg"; 
    } 

    try { 
     File file = new File(directory, filename); 
     outStream = new FileOutputStream(file); 
     scaled.compress(Bitmap.CompressFormat.JPEG, quality, outStream); 
    } 
    catch(Exception e) { 
     Utilities.logException(e); 
     e.printStackTrace(); 
    } 
    finally { 
     if (outStream != null) { 
      try { 
       outStream.flush(); 
       outStream.close(); 
      } 
      catch (Exception ex) { 
       // Ignore for now 
      } 
     } 
    } 
} 

Мои виды использования разрешения_доступа от моего AndroidManifest.xml являются:

<uses-permission android:name="android.permission.INTERNET" /> 
<uses-permission android:name="android.permission.CAMERA" /> 
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> 
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> 
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> 
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> 
<uses-permission android:name="com.google.android.providers.gsf.permission.READ_GSERVICES" /> 
<uses-permission android:name="android.permission.RECORD_AUDIO" /> 
<uses-permission android:name="android.permission.NFC" /> 

Исключение происходит в outStream = new FileOutputStream(file);, но Я ожидал бы, что у него возникла ошибка, когда я попытался создать сам файл, в который будет транслироваться вывод.

Вероятно, что-то отсутствует очевидный ...

+0

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

+0

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

+0

Как вы получили «каталог» при вызове 'saveImageJPG'? 'Environment.getExternalStorageDirectory()'? – alijandro

ответ

0

Я не уверен, если каталог, который вы имеете в виду это приложение-частное или нет. Я столкнулся с подобной проблемой и решил ее, установив параметр max-sdk. Вы можете найти в разделе «Сохранение файлов, приложение-частного» здесь: http://developer.android.com/guide/topics/data/data-storage.html#filesInternal

0

FileNotFoundException на выходного файла означает каталог не был найден.

+0

Это может быть возможностью. Хотя это поднимает еще больше вопросов. В настоящее время мы сохраняем наши носители в каталоге, который не является частным приложением. Возможно, пользователь удаляет каталог? Я видел это недавно. Угадайте, что мое единственное решение - сделать его закрытым для приложения, хотя нет физических ограничений для размера данных? У нас может быть много и много данных. –

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