Android ACTION_IMAGE_CAPTURE意图在返回应用之前崩溃

时间:2014-12-02 15:41:06

标签: java android

我正在尝试接收通过Mediastore.ACTION_IMAGE_CAPTURE意图拍摄的图片的URI,但由于某种原因,默认的相机应用(Google+)在它甚至返回我的活动之前和我的代码到达onActivityResult()之前崩溃了。我怀疑这与我制作意图的方式有关,但我不确定。这是我的代码:

alertDialog.setButton(AlertDialog.BUTTON_POSITIVE, "New", new DialogInterface.OnClickListener() {
        @Override
        public void onClick(DialogInterface dialog, int which) {
            Intent takePictureIntent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
            startActivityForResult(takePictureIntent, REQUEST_IMAGE_CAPTURE);
        }
    });

如果需要,我也可以添加我的onActivityResult代码,但我不确定它是否相关。

这是来自logcat的数据:

  

12-02 10:47:43.976 26437-26437 /? E / AndroidRuntime:致命异常:   主要       流程:com.google.android.apps.plus,PID:26437       java.lang.IllegalArgumentException:必须通过Intent的数据字段指定源URI。               在dot.a(PG:185)               在com.google.android.apps.photoeditor.fragments.PlusCropActivity.onCreate(PG:93)               在android.app.Activity.performCreate(Activity.java:5933)               在android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1105)               在android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2251)               在android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2360)               在android.app.ActivityThread.access $ 800(ActivityThread.java:144)               在android.app.ActivityThread $ H.handleMessage(ActivityThread.java:1278)               在android.os.Handler.dispatchMessage(Handler.java:102)               在android.os.Looper.loop(Looper.java:135)               在android.app.ActivityThread.main(ActivityThread.java:5221)               at java.lang.reflect.Method.invoke(Native Method)               在java.lang.reflect.Method.invoke(Method.java:372)               在com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:899)               在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:694)

这是因为启动意图的方式吗?有没有办法保持这个意图不要尝试裁剪照片,因为我在一个单独的意图中处理裁剪?

解决方案(我编辑了OferM提交的代码):

try
{
      tempFile = File.createTempFile("my_app", ".jpg");

      File storageDir = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES);
      File image = File.createTempFile("my_app", ".jpg",storageDir);
      uri = Uri.fromFile(image);
}catch(Exception e){}

alertDialog.setButton(AlertDialog.BUTTON_POSITIVE, "New", new DialogInterface.OnClickListener() {
      @Override
      public void onClick(DialogInterface dialog, int which) {
          Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
          takePictureIntent.putExtras(getIntent().getExtras());
          takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, uri);
          startActivityForResult(takePictureIntent, REQUEST_IMAGE_CAPTURE);
      }
});

1 个答案:

答案 0 :(得分:1)

试试这个:

alertDialog.setButton(AlertDialog.BUTTON_POSITIVE, "New", new DialogInterface.OnClickListener() {
        @Override
        public void onClick(DialogInterface dialog, int which) {
            Intent takePictureIntent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
            takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, uri);

            startActivityForResult(takePictureIntent, REQUEST_IMAGE_CAPTURE);
        }
    });

其中uri是您希望存储图像的本地路径。例如:

File tempFile = File.createTempFile("my_app", ".jpg");
fileName = tempFile.getAbsolutePath();
Uri uri = Uri.fromFile(tempFile);
相关问题