[编辑:问题解决了。请参阅下面的答案。]
在我的应用程序中,我调用系统摄像头拍照,然后在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);
}
我怎样才能找出为什么我的活动被杀死,从堆栈中删除而不是再次创建?
答案 0 :(得分:7)
好的,我发现了问题。问题并不在于活动被杀,而是活动没有得到恢复。我意识到当您使用android:noHistory="true"
在清单中声明您的活动时,可能会发生这种情况。因此,活动在被杀死时被从堆栈中移除,而之前的活动被显示出来。
删除noHistory
参数后,使用相机后活动开始再次出现。
答案 1 :(得分:2)
我想问题是1)在异常处理程序的自定义实现中,2)这一行:
intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(picFile));
NullPointerException
数据时,您的异常处理程序实现不允许您查看onActivityResult
方法中引发的Intent
。Intent
起始相机活动的额外内容放置,则似乎是一个阻止onActivityResult
传递给Intent
方法的错误。尝试删除该行,看看在相机活动完成后是否重新创建了活动。
答案 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) {...}
}
如果此代码仍不适合您,请参阅以下链接: