2015-07-21 3 views
2

Я пытаюсь сделать снимок и сохранить его во внутреннем кеше приложения, поскольку он будет удален, как только он будет загружен. Я использую следующий код для создания файла:«java.io.FileNotFoundException: Permission denied» в Android Cache Dir

public static File createInternalCacheImageFile(Context context, String imageFileName) throws IOException { 
     return File.createTempFile(
       imageFileName, 
       context.getString(R.string.image_extension), 
       context.getCacheDir() 
     ); 
    } 

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

takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(imageFile)); 
activity.startActivityForResult(takePictureIntent, REQUEST_CODE_IMAGE_CAPTURE); 

Активности камеры отображаются и после принятия картины, результат деятельности является 0. при взгляде на logcat следующее показано:

07-21 13:19:51.093 12889-12889/? E/CAM_StateSavePic﹕ exception while saving result to URI: Optional.of(file:///data/data/org.serengetitracker.androidapp/cache/image_random_205854910-2018234447.jpg) 
    java.io.FileNotFoundException: Permission denied 
      at android.os.Parcel.openFileDescriptor(Native Method) 
      at android.os.ParcelFileDescriptor.openInternal(ParcelFileDescriptor.java:253) 
      at android.os.ParcelFileDescriptor.open(ParcelFileDescriptor.java:199) 
      at android.content.ContentResolver.openAssetFileDescriptor(ContentResolver.java:916) 
      at android.content.ContentResolver.openOutputStream(ContentResolver.java:686) 
      at android.content.ContentResolver.openOutputStream(ContentResolver.java:662) 
      at com.android.camera.captureintent.state.StateSavingPicture.onEnter(StateSavingPicture.java:84) 
      at com.android.camera.captureintent.stateful.StateMachineImpl.jumpToState(StateMachineImpl.java:62) 
      at com.android.camera.captureintent.stateful.StateMachineImpl.processEvent(StateMachineImpl.java:110) 
      at com.android.camera.captureintent.state.StateOpeningCamera$9.onClick(StateOpeningCamera.java:307) 
      at android.view.View.performClick(View.java:4780) 
      at android.view.View$PerformClick.run(View.java:19866) 
      at android.os.Handler.handleCallback(Handler.java:739) 
      at android.os.Handler.dispatchMessage(Handler.java:95) 
      at android.os.Looper.loop(Looper.java:135) 
      at android.app.ActivityThread.main(ActivityThread.java:5254) 
      at java.lang.reflect.Method.invoke(Native Method) 
      at java.lang.reflect.Method.invoke(Method.java:372) 
      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903) 
      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698) 

Почему я не разрешается писать изображение внутренней директории кэша приложения?

Примечание: У меня есть разрешение android.permission.WRITE_EXTERNAL_STORAGE в моем приложении, хотя это не имеет значения, поскольку я не имею дело с внешним хранилищем.

+0

Вместо создания изображения в кеше попробуйте создать в своих 'data/data/org.serengetitracker.androidapp/images' –

ответ

5

Активность камеры работает в другом приложении, которое не имеет доступа к каталогу внутреннего кэша вашего приложения. Вы должны использовать внешний каталог или позволить приложению камеры выбрать сам каталог - и затем запросить этот путь (другой раздел), чтобы иметь возможность скопировать его в каталог кэша.

1

из следующих ссылки http://developer.android.com/reference/android/content/Context.html#getCacheDir() getCacheDir()

Returns the absolute path to the application specific cache directory on the filesystem 

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

Одним из решений было бы использовать папку во внешнем каталоге.

1

Этот является возможно без CAMERA и WRITE_EXTERNAL_STORAGE разрешений.

Вы можете создать временное место в каталоге кэша приложения и предоставить другим приложениям доступ к нему. Это делает файл доступную для записи с помощью приложения камеры:

File tempFile = File.createTempFile("photo", ".jpg", context.getCacheDir()); 
tempFile.setWritable(true, false); 

Теперь вам просто нужно передать этот файл в качестве выходного файла для умысла камеры:

Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); 
intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(mTempFile)); // pass temp file 
startActivityForResult(intent, REQUEST_CODE_CAMERA); 

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

+0

В Android 6.0.1 - разрешение отклонено – middlehut

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