执行摄像头意图时活动被杀死

时间:2012-03-16 19:57:32

标签: android android-activity android-intent

[编辑:问题解决了。请参阅下面的答案。]

在我的应用程序中,我调用系统摄像头拍照,然后在onActivityResult处理结果。你知道,通常。它曾经工作,但现在我的呼叫活动在我拍摄时被杀死了。具体来说,按下相机快门后,我的活动就会调用onDestroy()。照片确实拍摄了&保存(我已经检查过该文件是否写在SD卡上)。在我接受照片后,不是返回调用活动并调用onActivityResult,而是调用活动堆栈中的上一个活动。我在logcat中看不到任何异常。我的自定义异常处理程序不会被调用。如果重要,我的应用程序还包括一个收听GPS更新的服务,但我取消注册onPause()中的所有接收器。

这是MyCallingActivity.onDestroy()的调用堆栈:

Thread [<1> main] (Suspended (breakpoint at line 303 in NewPlaceDetailsActivity))   
    NewPlaceDetailsActivity.onDestroy() line: 303   
    ActivityThread.performDestroyActivity(IBinder, boolean, int, boolean) line: 2663    
    ActivityThread.handleDestroyActivity(IBinder, boolean, int, boolean) line: 2694 
    ActivityThread.access$2100(ActivityThread, IBinder, boolean, int, boolean) line: 117    
    BinderProxy(ActivityThread$H).handleMessage(Message) line: 968  
    ActivityThread$H(Handler).dispatchMessage(Message) line: 99 
    Looper.loop() line: 130 
    ActivityThread.main(String[]) line: 3687    
    Method.invokeNative(Object, Object[], Class, Class[], Class, int, boolean) line: not available [native method]  
    Method.invoke(Object, Object...) line: 507  
    ZygoteInit$MethodAndArgsCaller.run() line: 842  
    ZygoteInit.main(String[]) line: 600 
    NativeStart.main(String[]) line: not available [native method]  

这就是我开始相机活动的方式,以防你想知道:

protected void startCamera() {
    createPhotoDirsIfNeeded();

    String fileName = "temp.jpg";  
    ContentValues values = new ContentValues();  
    values.put(MediaStore.Images.Media.TITLE, fileName);  
    m_capturedImageUri = getContentResolver().insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values);  

    m_photoFileName = APP_PHOTO_PATH + "/" + DateFormat.format(DATE_FORMAT, Calendar.getInstance().getTime()) + ".jpg";
    File picFile = new File(m_photoFileName);
    if(picFile.exists()) {
        picFile.delete();
    }

    // start the camera activity
    Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
    intent.putExtra(MediaStore.EXTRA_OUTPUT,  Uri.fromFile(picFile));
    startActivityForResult(intent, IntentHelper.REQUEST_TAKE_PHOTO);
}

我怎样才能找出为什么我的活动被杀死,从堆栈中删除而不是再次创建?

3 个答案:

答案 0 :(得分:7)

好的,我发现了问题。问题并不在于活动被杀,而是活动没有得到恢复。我意识到当您使用android:noHistory="true"在清单中声明您的活动时,可能会发生这种情况。因此,活动在被杀死时被从堆栈中移除,而之前的活动被显示出来。

删除noHistory参数后,使用相机后活动开始再次出现。

答案 1 :(得分:2)

我想问题是1)在异常处理程序的自定义实现中,2)这一行:

intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(picFile));
  1. 当您尝试访问返回的NullPointerException数据时,您的异常处理程序实现不允许您查看onActivityResult方法中引发的Intent
  2. 如果输出文件已作为Intent起始相机活动的额外内容放置,则似乎是一个阻止onActivityResult传递给Intent方法的错误。
  3. 尝试删除该行,看看在相机活动完成后是否重新创建了活动。

答案 2 :(得分:0)

请按照以下步骤操作:

1)  Add this in manifest :
    <uses-feature android:name="android.hardware.camera"></uses-feature>

2)  startCamera() :
    Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
    intent.putExtra(MediaStore.EXTRA_OUTPUT,  Uri.fromFile(picFile));
    startActivityForResult(intent, IntentHelper.REQUEST_TAKE_PHOTO);


3)  if (requestCode == PICTURE_RESULT) //
             if (resultCode == Activity.RESULT_OK) {
                // Display image received on the view
                 Bundle b = data.getExtras(); // Kept as a Bundle to check for other  things in my actual code
                 Bitmap pic = (Bitmap) b.get("data");

                 if (pic != null) { // Display your image in an ImageView in your layout (if you want to test it)
                     pictureHolder = (ImageView) this.findViewById(R.id.IMAGE);
                     pictureHolder.setImageBitmap(pic);
                     pictureHolder.invalidate();
                 }
             }
             else if (resultCode == Activity.RESULT_CANCELED) {...}
    }

如果此代码仍不适合您,请参阅以下链接: