使用相机后无法恢复活动,应用程序崩溃

3

谁可以帮我检查这个错误,我在我的活动中使用startActivityForResult(用相机拍照)。拍完照片后,我的活动无法恢复。 :(

java.lang.RuntimeException: Unable to resume activity {com.example/com.example.view.main.PersonActivity}: java.lang.RuntimeException: Failure delivering result ResultInfo{who=null, request=998, result=-1, data=null} to activity {com.example/com.example.view.main.PersonActivity}: java.lang.NullPointerException

--------- Stack trace ---------

    android.app.ActivityThread.performResumeActivity(ActivityThread.java:2458)
    android.app.ActivityThread.handleResumeActivity(ActivityThread.java:2486)
    android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2000)
    android.app.ActivityThread.access$600(ActivityThread.java:128)
    android.app.ActivityThread$H.handleMessage(ActivityThread.java:1161)
    android.os.Handler.dispatchMessage(Handler.java:99)
    android.os.Looper.loop(Looper.java:137)
    android.app.ActivityThread.main(ActivityThread.java:4514)
    java.lang.reflect.Method.invokeNative(Native Method)
    java.lang.reflect.Method.invoke(Method.java:511)
    com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:790)
    com.android.internal.os.ZygoteInit.main(ZygoteInit.java:557)
    dalvik.system.NativeStart.main(Native Method)
-------------------------------

--------- Cause ---------

java.lang.RuntimeException: Failure delivering result ResultInfo{who=null, request=998, result=-1, data=null} to activity {com.example/com.example.view.main.PersonActivity}: java.lang.NullPointerException

    android.app.ActivityThread.deliverResults(ActivityThread.java:2994)
    android.app.ActivityThread.performResumeActivity(ActivityThread.java:2445)
    android.app.ActivityThread.handleResumeActivity(ActivityThread.java:2486)
    android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2000)
    android.app.ActivityThread.access$600(ActivityThread.java:128)
    android.app.ActivityThread$H.handleMessage(ActivityThread.java:1161)
    android.os.Handler.dispatchMessage(Handler.java:99)
    android.os.Looper.loop(Looper.java:137)
    android.app.ActivityThread.main(ActivityThread.java:4514)
    java.lang.reflect.Method.invokeNative(Native Method)
    java.lang.reflect.Method.invoke(Method.java:511)
    com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:790)
    com.android.internal.os.ZygoteInit.main(ZygoteInit.java:557)
    dalvik.system.NativeStart.main(Native Method)
-------------------------------

在我的Java代码中,在OnActivityResult方法中。
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    String filePath = "";
    switch (requestCode) {
    case MyActivity.RQ_SALE_TAKE_PHOTO:
        {
            if (resultCode == RESULT_OK) {
                if (data != null && data.getExtras() != null && data.getAction() != null) {
                    Bitmap tempBitmap = null;
                    tempBitmap = (Bitmap) data.getExtras().get("data");
                    //.....
                }
            } else {
                //DO SOMETHING HERE
            }
        }
        break;
    }
}

代码调用摄像头:

public static File takePhoto(Activity sender, int requestCode) {
    System.gc();
    final Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);

    String fileName = Constants.TEMP_IMG + "_" + DateUtils.getCurrentDateTimeWithFormat(null) + ".jpg";
    File retFile = new File(ExternalStorage.getTakenPhotoPath(sender), fileName);
    if (!retFile.exists())
        try {
            retFile.createNewFile();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(retFile));
    sender.startActivityForResult(intent, requestCode);
    return retFile;
}

有人能帮我解释上述错误,并告诉我如何修复这个错误吗?


你能放置调用相机意图的代码吗? - Renan Bandeira
4个回答

3

似乎返回的意图 "data" 为空。

请确保使用 startActivityForResult 和默认相机应用程序。

默认的 Android 相机应用程序仅在返回缩略图的情况下返回非空意图。如果传递带有要写入的 URL 的 EXTRA_OUTPUT,则会返回空意图,并且图片位于您传递的 URL 中。


嗨,Arun C Thomas,我已经检查了数据。 - Huỳnh Ngọc Bang
嗨,Arun,我的情况是"data"为空,在拍照后从URL获取了图像。但我在项目中没有找到任何代码行导致这个错误。 - Huỳnh Ngọc Bang
如果出现错误,那么很少见,可能是因为您的后台活动被销毁,导致“retFile”未正确保存到saveInstance中,因此它将为空。请确保正确恢复retFile。 - Arun C
3
当你从应用程序进入相机时,系统会消耗更多的内存,当你改变相机方向或做一些需要消耗更多内存的操作时,后台应用程序(你的应用程序)将被杀死,只有当活动结果返回时才会重新生成。所以当 onCreate 函数被调用时,takePhoto 函数中初始化的内容将会丢失。在这种情况下,生命周期将是 onCreate->onRestoreInstance->onActivityResult->onResume。如果 onActivityResult 函数出现问题,将会发生 "Unable to resume activity" 错误。 - Arun C
@TCA +1 对于详细的解释。提供更详细文章的链接会有所帮助。 - GuruM
显示剩余4条评论

0
尝试一下这个。。
 Intent cameraIntent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
    startActivityForResult(cameraIntent, requestCode);

0

尝试这段代码:

try {
    Intent intent = new Intent("android.media.action.IMAGE_CAPTURE");
    File photo = new File(photoPath);
    intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(photo));
    startActivityForResult(Intent.createChooser(intent, "Capture Image"),
                            MyActivity.RQ_SALE_TAKE_PHOTO);
} catch (Exception e) {
}

你的意图不同。 - Renan Bandeira
通常情况下它仍然可以工作,这个错误很少发生。你能解释一下为什么需要改变“意图”吗?谢谢Renan! - Huỳnh Ngọc Bang
一样的..我现在已经看过了,没有任何区别。 - Renan Bandeira

0

只需执行startActivity。当您执行startActivityForResult时,从其他启动的活动中,您需要将setResult()设置为您的活动。

现在相机活动没有为您设置任何结果,并且在onActivityResult函数中崩溃。


抱歉Sushil,通常情况下它仍然可以工作,这种错误很少发生。 - Huỳnh Ngọc Bang

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接