我打電話通過startActivityForResult
我的相機android.provider.MediaStore.ACTION_IMAGE_CAPTURE
和android.provider.MediaStore.EXTRA_OUTPUT
想要得到的全尺寸拍攝的圖像回到我的onActivityResult
ACTION_IMAGE_CAPTURE與EXTRA_OUTPUT將創建處理「處理媒體存儲錯誤」
但當下我點擊勾選後拍攝照片時,應該將照片傳回,我收到一條錯誤消息,該照片鬆散地轉換爲「相機錯誤 - 保存圖像或剪輯時出現問題」 - 我可以關閉對話框或將反饋發送給Google開發團隊。在這一刻
logcat的輸出是:
09-01 22:01:46.157 24523-24523/com.google.android.GoogleCamera E/CAM_FatalErrorHandler﹕ Handling Media Storage Failure:
java.lang.Exception
at com.android.camera.FatalErrorHandlerImpl.onMediaStorageFailure(FatalErrorHandlerImpl.java:37)
at com.android.camera.PhotoModule.onError(PhotoModule.java:274)
at com.android.camera.PhotoModule.onCaptureDone(PhotoModule.java:1289)
at com.android.camera.PhotoModule$8.onClick(PhotoModule.java:593)
at android.view.View.performClick(View.java:4781)
at android.view.View$PerformClick.run(View.java:19873)
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:5289)
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:904)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:699)
at de.robv.android.xposed.XposedBridge.main(XposedBridge.java:115)
09-01 22:01:46.158 24523-24523/com.google.android.GoogleCamera E/CAM_CameraUtil﹕ Show fatal error dialog
我的代碼(清潔無關部分):
private File tmpFile;
private Uri tmpFileURI;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
{
// TempFile needs to be created for the camera to store the fullsize captured image
// tmpFile = new File(Environment.getExternalStorageDirectory().getAbsolutePath() + MainActivity.APP_BASE_FOLDER + "/tmp.jpg");
try
{
tmpFile = File.createTempFile("my_app", ".jpg");
} catch (IOException e)
{
e.printStackTrace();
}
tmpFileURI = Uri.fromFile(tmpFile);
chooseCamera.setOnClickListener(new View.OnClickListener()
{
@Override
public void onClick(View view)
{
takePicture = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
takePicture.putExtra(android.provider.MediaStore.EXTRA_OUTPUT, tmpFileURI);
startActivityForResult(takePicture, CreateModifiyEventFragment.CHOOSE_BY_CAMERA);//zero can be replaced with any action code
}
});
chooseLibrary.setOnClickListener(new View.OnClickListener()
{
@Override
public void onClick(View view)
{
pickPhoto = new Intent(Intent.ACTION_PICK, android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
startActivityForResult(pickPhoto, CreateModifiyEventFragment.CHOOSE_BY_LIBRARY);//one can be replaced with any action code
}
});
}
的看到常量聲明如下:
public final static int CHOOSE_BY_CAMERA = 1;
public final static int CHOOSE_BY_LIBRARY = 0;
的回調代碼是永遠不會到達的,所以我只是想讓你更多的代碼。 你可以看到我通過tmpFile和一個正常的外部存儲文件來試用它。
權限也
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
設置我不知道是什麼原因引發此錯誤或什麼,我錯過了。我用其他的答案來創建這個代碼,我沒有看到任何區別。
任何幫助將不勝感激。先謝謝了!
我嘗試過'// tmpFile = new File(Environment.getExternalStorageDirectory()。getAbsolutePath()+ MainActivity.APP_BASE_FOLDER +「/tmp.jpg」);'正如你所看到的,同樣的錯誤。但'Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM)似乎可以解決這個錯誤。你能告訴我爲什麼嗎?攝像機不能寫入第一個位置嗎? – LilaQ
@LilaQ:永遠不要使用字符串連接來創建文件路徑。使用適當的'File'構造函數。我的猜測是,你在那裏得到了一個無效的路徑(例如,雙'/',缺少'/')。 – CommonsWare
我註銷了路徑以確保它是有效的。或者是在我的應用程序之外考慮攝像頭,因此沒有對externalStorageDirectory的寫權限? – LilaQ