ACTION_IMAGE_CAPTURE 与 EXTRA_OUTPUT 创建处理 "Handling Media Storage Error"

ACTION_IMAGE_CAPTURE with EXTRA_OUTPUT creates handled "Handling Media Storage Error"

我正在通过 startActivityForResult 使用 android.provider.MediaStore.ACTION_IMAGE_CAPTURE 调用我的相机,并且 android.provider.MediaStore.EXTRA_OUTPUT 想要在我的 onActivityResult

中恢复拍摄的全尺寸图像

但是当我在拍照后点击复选标记的那一刻,当它应该被送回的那一刻,我收到一条错误消息,大致翻译为 "Camera error - There has been a problem while saving one of your images or clips" - 我可以关闭对话框或发送反馈给 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.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" />

我不知道是什么触发了这个错误,也不知道我错过了什么。我使用其他 SO 答案来创建此代码,但没有发现任何差异。

如有任何帮助,我们将不胜感激。提前致谢!

File.createTempFile() 不太可能在 Android 上给你一些有用的东西。更重要的是,你无法知道第三方相机应用程序是否可以在那里写入。选择外部存储的位置(例如,getExternalFilesDir()Environment.getExternalStoragePublicDirectory()):

package com.commonsware.android.camcon;

import android.app.Activity;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.os.Environment;
import android.provider.MediaStore;
import java.io.File;

public class CameraContentDemoActivity extends Activity {
  private static final int CONTENT_REQUEST=1337;
  private File output=null;

  @Override
  public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    Intent i=new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
    File dir=
        Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM);

    output=new File(dir, "CameraContentDemo.jpeg");
    i.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(output));

    startActivityForResult(i, CONTENT_REQUEST);
  }

  @Override
  protected void onActivityResult(int requestCode, int resultCode,
                                  Intent data) {
    if (requestCode == CONTENT_REQUEST) {
      if (resultCode == RESULT_OK) {
        Intent i=new Intent(Intent.ACTION_VIEW);

        i.setDataAndType(Uri.fromFile(output), "image/jpeg");
        startActivity(i);
        finish();
      }
    }
  }
}

此外,您不需要 CAMERA 许可,因为您不是在拍照 — 您是在请求第三方应用拍照。