在Android Camera Intent上按下后退按钮时应用程序崩溃

时间:2011-07-08 09:16:08

标签: android android-intent android-camera

我在Android应用程序中使用相机时遇到问题

我有一个保存数据的表单,有一个按钮拍照与相机,相机拍摄的图像将以我的形式放在ImageView上。

调用相机意图并将图像放置在

形式中没有问题

我的问题是: 在相机应用程序中, 如果我按下后退按钮(返回表格)我的应用程序崩溃

为什么?

这是调用相机的按钮上的代码

btn_takepic.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View arg0) {            
        Intent cameraIntent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
        startActivityForResult(cameraIntent, CAMERA_PIC_REQUEST);
    }
});

这是我的onActivityResult

    @Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {

    final EditText et_foto = (EditText) findViewById(R.id.et_foto);
    if(requestCode == CAMERA_PIC_REQUEST) {          
            Bitmap thumbnail = (Bitmap) data.getExtras().get("data");  
        ImageView image = (ImageView) findViewById(R.id.imv_foto);  
        image.setImageBitmap(thumbnail);
        //toastkeun(data.getExtras().get("data").toString());
    }

    super.onActivityResult(requestCode, resultCode, data);
}

我正在测试真实设备 这是我的logCat

07-08 16:05:26.187: ERROR/AndroidRuntime(12116): FATAL EXCEPTION: main
07-08 16:05:26.187: ERROR/AndroidRuntime(12116): java.lang.RuntimeException: Failure delivering result ResultInfo{who=null, request=2, result=0, data=null} to activity {com.ngimagrid.nigmago/com.ngimagrid.nigmago.FormAsetTambah}: java.lang.NullPointerException
07-08 16:05:26.187: ERROR/AndroidRuntime(12116):     at android.app.ActivityThread.deliverResults(ActivityThread.java:3515)
07-08 16:05:26.187: ERROR/AndroidRuntime(12116):     at android.app.ActivityThread.handleSendResult(ActivityThread.java:3557)
07-08 16:05:26.187: ERROR/AndroidRuntime(12116):     at android.app.ActivityThread.access$2800(ActivityThread.java:125)
07-08 16:05:26.187: ERROR/AndroidRuntime(12116):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2063)
07-08 16:05:26.187: ERROR/AndroidRuntime(12116):     at android.os.Handler.dispatchMessage(Handler.java:99)
07-08 16:05:26.187: ERROR/AndroidRuntime(12116):     at android.os.Looper.loop(Looper.java:123)
07-08 16:05:26.187: ERROR/AndroidRuntime(12116):     at android.app.ActivityThread.main(ActivityThread.java:4627)
07-08 16:05:26.187: ERROR/AndroidRuntime(12116):     at java.lang.reflect.Method.invokeNative(Native Method)
07-08 16:05:26.187: ERROR/AndroidRuntime(12116):     at java.lang.reflect.Method.invoke(Method.java:521)
07-08 16:05:26.187: ERROR/AndroidRuntime(12116):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:858)
07-08 16:05:26.187: ERROR/AndroidRuntime(12116):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
07-08 16:05:26.187: ERROR/AndroidRuntime(12116):     at dalvik.system.NativeStart.main(Native Method)
07-08 16:05:26.187: ERROR/AndroidRuntime(12116): Caused by: java.lang.NullPointerException
07-08 16:05:26.187: ERROR/AndroidRuntime(12116):     at com.ngimagrid.nigmago.FormAsetTambah.onActivityResult(FormAsetTambah.java:246)
07-08 16:05:26.187: ERROR/AndroidRuntime(12116):     at android.app.Activity.dispatchActivityResult(Activity.java:3890)
07-08 16:05:26.187: ERROR/AndroidRuntime(12116):     at android.app.ActivityThread.deliverResults(ActivityThread.java:3511)
07-08 16:05:26.187: ERROR/AndroidRuntime(12116):     ... 11 more
07-08 16:05:26.187: ERROR/AndroidRuntime(12116): FATAL EXCEPTION: main
07-08 16:05:26.187: ERROR/AndroidRuntime(12116): java.lang.RuntimeException: Failure delivering result ResultInfo{who=null, request=2, result=0, data=null} to activity {com.ngimagrid.nigmago/com.ngimagrid.nigmago.FormAsetTambah}: java.lang.NullPointerException
07-08 16:05:26.187: ERROR/AndroidRuntime(12116):     at android.app.ActivityThread.deliverResults(ActivityThread.java:3515)
07-08 16:05:26.187: ERROR/AndroidRuntime(12116):     at android.app.ActivityThread.handleSendResult(ActivityThread.java:3557)
07-08 16:05:26.187: ERROR/AndroidRuntime(12116):     at android.app.ActivityThread.access$2800(ActivityThread.java:125)
07-08 16:05:26.187: ERROR/AndroidRuntime(12116):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2063)
07-08 16:05:26.187: ERROR/AndroidRuntime(12116):     at android.os.Handler.dispatchMessage(Handler.java:99)
07-08 16:05:26.187: ERROR/AndroidRuntime(12116):     at android.os.Looper.loop(Looper.java:123)
07-08 16:05:26.187: ERROR/AndroidRuntime(12116):     at android.app.ActivityThread.main(ActivityThread.java:4627)
07-08 16:05:26.187: ERROR/AndroidRuntime(12116):     at java.lang.reflect.Method.invokeNative(Native Method)
07-08 16:05:26.187: ERROR/AndroidRuntime(12116):     at java.lang.reflect.Method.invoke(Method.java:521)
07-08 16:05:26.187: ERROR/AndroidRuntime(12116):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:858)
07-08 16:05:26.187: ERROR/AndroidRuntime(12116):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
07-08 16:05:26.187: ERROR/AndroidRuntime(12116):     at dalvik.system.NativeStart.main(Native Method)
07-08 16:05:26.187: ERROR/AndroidRuntime(12116): Caused by: java.lang.NullPointerException
07-08 16:05:26.187: ERROR/AndroidRuntime(12116):     at com.ngimagrid.nigmago.FormAsetTambah.onActivityResult(FormAsetTambah.java:246)
07-08 16:05:26.187: ERROR/AndroidRuntime(12116):     at android.app.Activity.dispatchActivityResult(Activity.java:3890)
07-08 16:05:26.187: ERROR/AndroidRuntime(12116):     at android.app.ActivityThread.deliverResults(ActivityThread.java:3511)
07-08 16:05:26.187: ERROR/AndroidRuntime(12116):     ... 11 more

从这一行开始,我认为这就是问题......

07-08 16:05:26.187: ERROR/AndroidRuntime(12116): java.lang.RuntimeException: Failure delivering result ResultInfo{who=null, request=2, result=0, data=null} to activity {com.ngimagrid.nigmago/com.ngimagrid.nigmago.FormAsetTambah}: java.lang.NullPointerException

没有结果回来了吗? 如何解决这个问题?

感谢

cmiiw

5 个答案:

答案 0 :(得分:4)

NullPointerException是由您的代码引起的,假设data.getExtras()。get(“data”)将返回一些内容。这是一个完全未记录的参数,在许多(大多数)设备上将返回null。

如果看起来,你正试图获得一个缩略图,你可以尝试这样的东西,它尝试从已知(对我而言)的方式从Camera Intent的结果中提取缩略图。

Bitmap thumb;   
if (data.getData() != null) {
    try {
        Uri uri = data.getData();
        thumb = Images.Thumbnails.getThumbnail(getContentResolver(), Long.parseLong(uri.getLastPathSegment()), Images.Thumbnails.MICRO_KIND, null);
        } catch (Exception typeNotSupported) {

        }
    }
    if (thumb == null) {
        thumb = (Bitmap) data.getExtras().get("data");
    }
}

顺便提一下,我认为还有另一个错误 - 你的onActivityResult也应该测试resultCode是否正常 - 如果用户从相机取消我相信onActivityResult仍然会被调用。

我希望这很有用。

答案 1 :(得分:3)

我认为这不是来自您的应用。您可以尝试在try / catch块中包围整个onActivity结果代码。我认为你正在经历的是一些手机上的相机错误。还尝试尝试在startActivityForResult意图上发送的额外组件的不同组合。

在执行任何操作之前,请始终检查结果代码。如果结果被取消(Activity.RESULT_CANCELED)或ok(Activity.RESULT_OK)

,你不想制作相同的代码

还有一个错误,结果没有出现在EXTRA_OUTPUT中(我认为它的名字是这样的),而是它作为一个在intent.getData()中的Uri。额外输出是您提供保存文件的路径,而uri返回通常是保存在默认摄像机位置的图像。你会看到它有点不同。

您没有使用标记atm,但如果您想要图像位置,则应该使用。搜索堆栈以获取额外的一些示例代码。

答案 2 :(得分:2)

是的,您可以通过这种方式在画廊或相机或任何其他方式处理后退按钮。

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data)
{
    if (resultCode != RESULT_OK) 
    {
    //Here you can handle,do anything you want
    }
//other code
}

答案 3 :(得分:0)

你在谈论我知道的YouTube视频时,我遇到了同样的错误。

protected void onCreate(Bundle savedInstanceState)
{

    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    try 
    {    
            Button btn = (Button) findViewById(R.id.takePhoto);
            btn.setOnClickListener(new OnClickListener() 
            {

                @Override
                public void onClick(View v) 
                {
                       Intent intent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
                       startActivityForResult(intent, 0);
                }

             });
            iv = (ImageView) findViewById(R.id.imageView);

    } 
     catch (Exception e) 
    {
         e.printStackTrace();
    }

}

答案 4 :(得分:0)

我认为可以通过一个简单的技巧来解决

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data)   {
    super.onActivityResult(requestCode, resultCode, data);
    if(resultCode==0)
    {
        return;
    }