相机在拍完照片后撞坏了

时间:2015-02-28 00:08:29

标签: java android android-camera

我正在开发一个发送意图拍照的应用程序。我正在使用Galaxy S5,但这个问题在3种不同的设备上得到了证实。

首先,相机开始做一个循环,然后点击确定再返回拍摄另一张照片。我重构了代码并解决了这个问题,但还有其他问题。现在,在打开拍摄照片屏幕后,使用后退按钮成功返回并在拍摄照片后再次重试。然而点击确​​定会做以下三件事之一:

  • 作品(〜%20)
  • 在我自己的错误处理程序中抛出错误 。 “不幸的是,MyApp意外停止了”。然后它回到调用活动,从我的处理程序抛出一个错误,因为现在它正在尝试读取现在为空的东西(可能是因为应用程序崩溃了)。断点现在被忽略,我必须再次启动调试。我可以回到应用程序的第一页并再次进行处理,但调试没有响应。 (〜30%)
  • 与之前相同,除了我的错误被抛出,我点击后退按钮摆脱它然后后退按钮回到屏幕然后我得到“不幸的是myApp已经停止”。 (〜50%)

能够找到从相机中抛出的错误导致最初的怪异,然后导致一切崩溃。我在onActivityResult上有一个断点,如果抛出错误,它永远不会被触发。此外,startActivityForResult上的catch块也从不抛出该错误。这些错误总是来自onEreate中的NPE,因为活动尝试在拍摄照片后再次启动或者应用程序抛出“不幸的myApp已经停止”。

我有更多细节,但我不想超载信息。基本上当我点击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.access$900(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)

1 个答案:

答案 0 :(得分:4)

我很抱歉没有更清楚地问这个问题,因为我不太确定自己。事实证明,这是多个问题,我错误地认为是同一个问题。希望这将有助于其他人在未来。以下是我遇到的问题的摘要

  1. 每当它从相机意图返回时,调试器就是
    分离(我认为这是因为相机的错误
    但结果有些正常)

  2. 当从相机意图返回时,有时应用程序被操作系统摧毁(我假设是为了内存
    原因)。这导致零星的行为和我的状态对象
    返回时会有几个空字段,使我的应用程序崩溃。

    • 修复:在发送图片之前将状态对象写入文件,在我处理onCreate的父活动类中加载然后转到 子类活动。
  3. 当应用程序被销毁时,调用onCreate然后调用onActivityResult,而不是在应用程序未被销毁时调用onActivityResult。这引起了奇怪的行为,因为我在创建时调用了相机意图。

    • 修复:检查savedInstanceState是否为null以检查活动是否有先前的数据,如果没有,则会启动相机。这解决了这个问题,有时它会陷入拍摄照片并返回相机的无限循环中。
  4. 由于其他问题,在我的正常错误吐司或我的日志(从调试器有时会分离)中并不总能看到错误,这使调试变得更加困难,因为它不一致。

    • 与#1相同。