拍照并点击确定后相机崩溃
Camera crashes after taking picture and hitting ok
我正在开发一个发送拍照意图的应用程序。我使用的是 Galaxy S5,但在 3 种不同的设备上都确认了这个问题。
首先相机开始循环,点击 OK 返回拍摄另一张照片。我重构了代码并解决了那个问题,但还有其他问题。现在,在调出拍照屏幕后,使用后退按钮成功返回并在拍照后点击重试工作正常。然而,点击 OK 会做以下三件事之一:
- 有效(~%20)
- 在我自己的错误处理程序之外引发错误。
"Unfortunately MyApp has stopped unexpectedly"。然后它返回到调用 activity,从我的处理程序中抛出错误,因为现在它正在尝试读取现在为空的内容(大概是因为应用程序崩溃了)。断点现在被忽略,我必须再次启动调试。我可以返回到应用程序的第一页并再次执行该过程,但调试没有响应。 (~30%)
- 除了抛出错误外,与之前相同,我单击后退按钮摆脱它,然后单击后退按钮返回屏幕,然后我得到 "Unfortunately myApp has stopped"。 (~50%)
我没有能够找到从相机抛出的错误,该错误导致最初的怪异,然后导致一切崩溃。我在 onActivityResult 上有一个断点,如果抛出错误,它永远不会被触发。另外,我在 startActivityForResult
上的 catch 块永远不会抛出该错误。错误总是来自 onCreate 中的 NPE,因为 activity 在拍摄照片或应用抛出 "Unfortunately myApp has stopped" 后尝试再次启动。
我有很多详细信息,但我不想让信息过多。基本上,当我点击 OK 时,它要么在大约 20% 的时间内工作,要么在其他 80% 的时间内完全崩溃。谁能指出我正确的方向,为什么结果看起来如此随机和不可预测?谢谢!
我一直在关注这个教程:
http://developer.android.com/training/camera/photobasics.html
callingActivity
private class SetCounterActivityMenu implements OnMenuItemClickListener {
private FieldAppActivity a;
private SetCounterActivityMenu(FieldAppActivity _a) {
this.a = _a;
}
@Override
public boolean onMenuItemClick(MenuItem view) {
switch (view.getItemId()) {
case 777771: {
try{
//nextActivity(CameraActivityNative.class);
cameraAN = new CameraActivityNative(handler,SetCounterActivity.this);
Intent intent = cameraAN.getPictureIntent();
startActivityForResult(intent, cameraAN.CAPTURE_IMAGE_ACTIVITY_REQUEST_CODE);
}
catch (Exception ex){
handler.error("Error occured taking picture", ex);
}
break;
}
case 777772: {
a.showMap(MapShowsWhat.survey);
break;
}
}
return false;
}
}
CameraActivityNative.java
public Intent getPictureIntent() {
// create Intent to take a picture and return control to the calling application
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
// create a file to save the image
try {
fileUri = createMultimediaFile(MEDIA_TYPE_IMAGE, handler);
}
catch (Exception e){
Utils.log("Camera Activity Native", "cannot create file", 'e');
}
// set the image file name
intent.putExtra(MediaStore.EXTRA_OUTPUT, fileUri);
// start the image Intent
return intent;
}
private Uri createMultimediaFile(int type, FieldApplicationManager.FAMEventHandler handler) throws UnsupportedOperationException, IOException{
// To be safe, you should check that the SDCard is mounted
// using Environment.getExternalStorageState() before doing this.
File mediaStorageDir = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES), "MyDir");
// Create the storage directory if it does not exist
if (! mediaStorageDir.exists()){
if (! mediaStorageDir.mkdirs()){
Utils.log("CameraActivityNative", "failed to create directory", 'd');
return null;
}
}
// Create a media file name
String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date());
String imageFileName;
String fileSuffix;
if (type == MEDIA_TYPE_IMAGE){
imageFileName = "IMG_"+ timeStamp + ".jpg";
}
else if (type == MEDIA_TYPE_VIDEO) {
imageFileName = "VID_"+ timeStamp + ".mp4";
}
else {
throw new UnsupportedOperationException("Media type not supported");
}
File mediaFile = new File(mediaStorageDir, imageFileName);
// Save a file: path for use with ACTION_VIEW intents
// galleryAddPic("file:" + mediaFile.getAbsolutePath());
return Uri.fromFile(mediaFile);
}
Logcat 错误。我不确定这是否真的相关,因为这是相机已经崩溃后抛出的错误。
02-27 17:56:27.609 17153-17153/android.fieldteam E/ERROR﹕ Message: Attempt to read from field 'java.lang.String android.api.CountSurvey.stationid' on a null object reference
Last System Info: null
Parameter: onGCFCreate
Stack Trace: java.lang.NullPointerException: Attempt to read from field 'java.lang.String android.api.CountSurvey.stationid' on a null object reference
at android.gui.SetCounterActivity.onGCFCreate(SetCounterActivity.java:33)
at android.gui.FieldAppActivity.onCreate(FieldAppActivity.java:64)
at android.app.Activity.performCreate(Activity.java:6221)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1119)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2614)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2728)
at android.app.ActivityThread.access0(ActivityThread.java:172)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1421)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:145)
at android.app.ActivityThread.main(ActivityThread.java:5837)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1388)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1183)
我很抱歉在问这个问题时没有说清楚,因为我自己也不确定。结果一次出现了多个问题,我错误地认为它们都是同一个问题。希望这会在将来帮助其他人。下面总结一下我遇到的问题
每当它从相机意图返回时,调试器就是
分离(我认为这是因为相机的错误
但结果有点正常)
- 修复:强制调试器等待并重新连接
Debugger disconnects when calling external intent (camera)
当从相机意图返回时,有时应用程序被操作系统破坏(我假设内存
原因)。这导致了零星的行为和我的状态对象
返回时会有几个空字段,使我的应用程序崩溃。
- 修复:在发送图片之前将状态对象写入文件,加载我的父 activity class 处理 onCreate 然后转到
subclassed activity.
当应用程序被销毁时,先调用 onCreate 然后再调用 onActivityResult,而不是在应用程序未被销毁时才调用 onActivityResult。当我在创建时调用相机意图时,这导致了奇怪的行为。
- 修复:检查 savedInstanceState 是否为空,以检查 activity 是否有以前的数据,如果没有,它将启动相机。这解决了有时会陷入拍照和返回相机的无限循环的问题。
由于其他问题,错误并不总是出现在我的正常错误 toast 或我的日志中(有时从调试器分离)这使得调试变得更加困难,因为它不一致.
- 同#1。
我正在开发一个发送拍照意图的应用程序。我使用的是 Galaxy S5,但在 3 种不同的设备上都确认了这个问题。
首先相机开始循环,点击 OK 返回拍摄另一张照片。我重构了代码并解决了那个问题,但还有其他问题。现在,在调出拍照屏幕后,使用后退按钮成功返回并在拍照后点击重试工作正常。然而,点击 OK 会做以下三件事之一:
- 有效(~%20)
- 在我自己的错误处理程序之外引发错误。 "Unfortunately MyApp has stopped unexpectedly"。然后它返回到调用 activity,从我的处理程序中抛出错误,因为现在它正在尝试读取现在为空的内容(大概是因为应用程序崩溃了)。断点现在被忽略,我必须再次启动调试。我可以返回到应用程序的第一页并再次执行该过程,但调试没有响应。 (~30%)
- 除了抛出错误外,与之前相同,我单击后退按钮摆脱它,然后单击后退按钮返回屏幕,然后我得到 "Unfortunately myApp has stopped"。 (~50%)
我没有能够找到从相机抛出的错误,该错误导致最初的怪异,然后导致一切崩溃。我在 onActivityResult 上有一个断点,如果抛出错误,它永远不会被触发。另外,我在 startActivityForResult
上的 catch 块永远不会抛出该错误。错误总是来自 onCreate 中的 NPE,因为 activity 在拍摄照片或应用抛出 "Unfortunately myApp has stopped" 后尝试再次启动。
我有很多详细信息,但我不想让信息过多。基本上,当我点击 OK 时,它要么在大约 20% 的时间内工作,要么在其他 80% 的时间内完全崩溃。谁能指出我正确的方向,为什么结果看起来如此随机和不可预测?谢谢!
我一直在关注这个教程: http://developer.android.com/training/camera/photobasics.html
callingActivity
private class SetCounterActivityMenu implements OnMenuItemClickListener {
private FieldAppActivity a;
private SetCounterActivityMenu(FieldAppActivity _a) {
this.a = _a;
}
@Override
public boolean onMenuItemClick(MenuItem view) {
switch (view.getItemId()) {
case 777771: {
try{
//nextActivity(CameraActivityNative.class);
cameraAN = new CameraActivityNative(handler,SetCounterActivity.this);
Intent intent = cameraAN.getPictureIntent();
startActivityForResult(intent, cameraAN.CAPTURE_IMAGE_ACTIVITY_REQUEST_CODE);
}
catch (Exception ex){
handler.error("Error occured taking picture", ex);
}
break;
}
case 777772: {
a.showMap(MapShowsWhat.survey);
break;
}
}
return false;
}
}
CameraActivityNative.java
public Intent getPictureIntent() {
// create Intent to take a picture and return control to the calling application
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
// create a file to save the image
try {
fileUri = createMultimediaFile(MEDIA_TYPE_IMAGE, handler);
}
catch (Exception e){
Utils.log("Camera Activity Native", "cannot create file", 'e');
}
// set the image file name
intent.putExtra(MediaStore.EXTRA_OUTPUT, fileUri);
// start the image Intent
return intent;
}
private Uri createMultimediaFile(int type, FieldApplicationManager.FAMEventHandler handler) throws UnsupportedOperationException, IOException{
// To be safe, you should check that the SDCard is mounted
// using Environment.getExternalStorageState() before doing this.
File mediaStorageDir = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES), "MyDir");
// Create the storage directory if it does not exist
if (! mediaStorageDir.exists()){
if (! mediaStorageDir.mkdirs()){
Utils.log("CameraActivityNative", "failed to create directory", 'd');
return null;
}
}
// Create a media file name
String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date());
String imageFileName;
String fileSuffix;
if (type == MEDIA_TYPE_IMAGE){
imageFileName = "IMG_"+ timeStamp + ".jpg";
}
else if (type == MEDIA_TYPE_VIDEO) {
imageFileName = "VID_"+ timeStamp + ".mp4";
}
else {
throw new UnsupportedOperationException("Media type not supported");
}
File mediaFile = new File(mediaStorageDir, imageFileName);
// Save a file: path for use with ACTION_VIEW intents
// galleryAddPic("file:" + mediaFile.getAbsolutePath());
return Uri.fromFile(mediaFile);
}
Logcat 错误。我不确定这是否真的相关,因为这是相机已经崩溃后抛出的错误。
02-27 17:56:27.609 17153-17153/android.fieldteam E/ERROR﹕ Message: Attempt to read from field 'java.lang.String android.api.CountSurvey.stationid' on a null object reference
Last System Info: null
Parameter: onGCFCreate
Stack Trace: java.lang.NullPointerException: Attempt to read from field 'java.lang.String android.api.CountSurvey.stationid' on a null object reference
at android.gui.SetCounterActivity.onGCFCreate(SetCounterActivity.java:33)
at android.gui.FieldAppActivity.onCreate(FieldAppActivity.java:64)
at android.app.Activity.performCreate(Activity.java:6221)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1119)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2614)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2728)
at android.app.ActivityThread.access0(ActivityThread.java:172)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1421)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:145)
at android.app.ActivityThread.main(ActivityThread.java:5837)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1388)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1183)
我很抱歉在问这个问题时没有说清楚,因为我自己也不确定。结果一次出现了多个问题,我错误地认为它们都是同一个问题。希望这会在将来帮助其他人。下面总结一下我遇到的问题
每当它从相机意图返回时,调试器就是
分离(我认为这是因为相机的错误
但结果有点正常)- 修复:强制调试器等待并重新连接
Debugger disconnects when calling external intent (camera)
- 修复:强制调试器等待并重新连接
当从相机意图返回时,有时应用程序被操作系统破坏(我假设内存
原因)。这导致了零星的行为和我的状态对象
返回时会有几个空字段,使我的应用程序崩溃。- 修复:在发送图片之前将状态对象写入文件,加载我的父 activity class 处理 onCreate 然后转到 subclassed activity.
当应用程序被销毁时,先调用 onCreate 然后再调用 onActivityResult,而不是在应用程序未被销毁时才调用 onActivityResult。当我在创建时调用相机意图时,这导致了奇怪的行为。
- 修复:检查 savedInstanceState 是否为空,以检查 activity 是否有以前的数据,如果没有,它将启动相机。这解决了有时会陷入拍照和返回相机的无限循环的问题。
由于其他问题,错误并不总是出现在我的正常错误 toast 或我的日志中(有时从调试器分离)这使得调试变得更加困难,因为它不一致.
- 同#1。