0

Я пытаюсь сохранить фотографию, сделанную камерой в приложении для Android. Я использую класс AsyncTask для выполнения задания, однако в функции onBackground генерируется исключение - FileNotFoundException. Это происходит, хотя у меня есть права на чтение и запись для внешнего хранилища в манифесте.Файл не найден при сохранении изображения

private class SaveImageTask extends AsyncTask<byte[], Void, String> { 

    @Override 
    protected String doInBackground(byte[]... data) { 
     FileOutputStream outStream = null; 
     String url = "example"; 
     try {  
      System.out.println("x"); 
      File dir = new File (Environment.getExternalStorageDirectory() + "/camtest/"); 
      System.out.println(dir); 
      if(!dir.exists()) dir.mkdir();    
      Locale locale = new Locale("en"); 
      String fileName = String.format(locale, "%d.jpg", System.currentTimeMillis());   
      File outFile = new File(dir, fileName); 
      System.out.println(outFile.getAbsolutePath()); 
      outStream = new FileOutputStream(outFile);    
      outStream.write(data[0]); 
      outStream.flush(); 
      outStream.close();   
      System.out.println("x"); 
      refreshGallery(outFile);   
      Toast.makeText(getApplicationContext(), "try", Toast.LENGTH_LONG).show(); 
      url = outFile.getAbsolutePath(); 
     } catch (FileNotFoundException e) { 
      e.printStackTrace(); 
      System.out.println("File not found"); 
     } catch (IOException e) { 
      e.printStackTrace(); 
      System.out.println("IO exception"); 
     } finally { 
     } 
     return url; 
    } 

    @Override 
    protected void onPostExecute(String result) { 
     // TODO Auto-generated method stub 
     super.onPostExecute(result); 
     locationToSave.setPhotoURL(result); 
     Toast.makeText(getApplicationContext(), result, Toast.LENGTH_LONG).show(); 

    } 
} 

Мой журнал вывод состоит в следующем:

01-02 16:53:12.692: I/System.out(16460): x 
01-02 16:53:12.692: I/System.out(16460): /mnt/sdcard/camtest 
01-02 16:53:12.692: I/System.out(16460): /mnt/sdcard/camtest/1420213992701.jpg 
01-02 16:53:12.722: I/System.out(16460): File not found 

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

Любые идеи?

EDIT: трассировка стека

01-02 17:18:48.300: W/System.err(18516): java.io.FileNotFoundException:  /mnt/sdcard/camtest/1420215528309.jpg: open failed: EACCES (Permission denied) 
01-02 17:18:48.300: W/System.err(18516): at libcore.io.IoBridge.open(IoBridge.java:406) 
01-02 17:18:48.300: W/System.err(18516): at java.io.FileOutputStream.<init>(FileOutputStream.java:88) 
01-02 17:18:48.300: W/System.err(18516): at java.io.FileOutputStream.<init>(FileOutputStream.java:73) 
01-02 17:18:48.300: W/System.err(18516): at  michal.myapp.activities.CameraActivity$SaveImageTask.doInBackground(CameraActivity.java:244) 
01-02 17:18:48.300: W/System.err(18516): at michal.myapp.activities.CameraActivity$SaveImageTask.doInBackground(CameraActivity.java:1) 
01-02 17:18:48.300: W/System.err(18516): at android.os.AsyncTask$2.call(AsyncTask.java:264) 
01-02 17:18:48.300: W/System.err(18516): at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305) 
01-02 17:18:48.300: W/System.err(18516): at java.util.concurrent.FutureTask.run(FutureTask.java:137) 
01-02 17:18:48.300: W/System.err(18516): at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:208) 
01-02 17:18:48.300: W/System.err(18516): at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076) 
01-02 17:18:48.300: W/System.err(18516): at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569) 
01-02 17:18:48.300: W/System.err(18516): at java.lang.Thread.run(Thread.java:864) 
01-02 17:18:48.300: W/System.err(18516): Caused by: libcore.io.ErrnoException: open failed: EACCES (Permission denied) 
01-02 17:18:48.310: W/System.err(18516): at libcore.io.Posix.open(Native Method) 
01-02 17:18:48.310: W/System.err(18516): at libcore.io.BlockGuardOs.open(BlockGuardOs.java:110) 
01-02 17:18:48.310: W/System.err(18516): at libcore.io.IoBridge.open(IoBridge.java:390) 
01-02 17:18:48.310: W/System.err(18516): ... 11 more 
+0

почему вы возвращаетесь __url__ дважды? –

+0

Да, я забыл удалить второй. но это не имеет значения, потому что программа никогда не достигает конца блока try в любом случае – user4359659

+0

Можете ли вы добавить Stacktrace исключения? Может возникнуть проблема разрешения: [JavaDoc] (http://docs.oracle.com/javase/7/docs/api/java/io/FileOutputStream.html#FileOutputStream%28java.io.File%29). – Tom

ответ

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