2015-07-21 149 views
2

我試圖拍攝一張照片並將其保存到應用程序的內部緩存中,因爲一旦它上傳,它將被刪除。我使用下面的代碼來創建文件:Android內部緩存中的「java.io.FileNotFoundException:Permission denied」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

這個可能沒有CAMERAWRITE_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); 

注:由相機應用使文件可寫的文件URI不會在活動結果中傳遞給你,你必須保存對tempFile的引用並從那裏檢索它。

+0

在Android 6.0.1中 - 權限被拒絕 – middlehut