2015-02-28 2 views
1

Я разрабатываю приложение, которое отправляет намерение сделать снимок. Я использую Galaxy S5, но эта проблема подтверждена на трех разных устройствах.Сбой камеры после съемки и удара

Сначала камера начала делать петлю, где нажатие OK просто вернулось назад, чтобы сделать еще одну фотографию. Я реорганизовал код и исправил эту проблему, но имел другие. Теперь, после поднятия экрана фотосъемки, использование кнопки «Назад» успешно завершается, и попытка повторить попытку после фотографирования работает отлично. Однако попав КИ делает один из трех вещей:

  • Works (~% 20)
  • выдает ошибку вне моего собственного обработчика ошибок. «К сожалению, MyApp неожиданно остановился». Затем он возвращается к вызывающей активности, вызывая ошибку из моего обработчика, потому что теперь он пытается читать из чего-то, что теперь является нулевым (предположительно, потому что приложение разбилось). Точки останова теперь игнорируются, и я снова должен снова запускать отладки. Я могу вернуться на первую страницу приложения и снова пройти процесс, но отладка не отвечает. (~ 30%)
  • Как и раньше, кроме моей ошибки, я нажимаю кнопку «Назад», чтобы избавиться от нее, а затем кнопку «Назад», чтобы вернуться на экран, а затем я получу «К сожалению, myApp остановился». (~ 50%)

меня не удалось найти ошибку, выбрасываемые из камеры, которая вызывает начальную странность, а затем приводит все к сбою. У меня есть точка останова onActivityResult, которая никогда не срабатывает, если возникает ошибка. Также мой блок catch на startActivityForResult никогда не выдает эту ошибку. Ошибки всегда исходят от NPE в onCreate, когда действие пытается снова начать работу после того, как сделана фотография или приложение выбрасывает «К сожалению, 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) 
+0

Было бы полезно, если бы вы могли вставить трассировку стека из логарифма. – Ben

+0

Трудно получить представление о структуре вашего кода, поскольку большая часть кода, который вы опубликовали, существует вне методов. Можете ли вы разместить свой код как часть их правильных методов и обратных вызовов? – Dyrborg

+0

Я добавил. К сожалению, я не смог найти стек, исходящий из самой камеры. – farnett

ответ

3

Прошу прощения за то, что я не стал более ясным в задании этого вопроса, поскольку сам не был уверен. Оказалось, что это сразу несколько проблем, которые я по ошибке принимал во всех проблемах. Надеюсь, это поможет кому-то еще в будущем.Вот краткое изложение проблем, с которыми я столкнулся

  1. Всякий раз, когда он вернулся из намерения камеры отладчик был
    отсоединение (я думал, что это из-за ошибки с камеры
    но оказывается несколько нормальный)

  2. При возврате с камеры иногда приложение было уничтожено операционной системой (я предполагаю для памяти
    причинам). Это привело к спорадическому поведению, и мой объект состояния
    имел бы несколько нулевых полей после возвращения, что привело бы к сбою приложения.

    • Fix: Написать состояние объекта в файл перед отправкой изображения, загрузите в моем родительском классе активности, который обрабатывает OnCreate затем переходит к подклассам деятельности.
  3. Когда приложение было уничтожено, onCreate был вызван thenActivityResult, а не просто вызывает onActivityResult, когда приложение не было уничтожено. Это вызвало странное поведение, поскольку я вызывал намерение камеры на создание.

    • Исправление: поставьте галочку, если savedInstanceState был равен нулю, чтобы проверить, были ли у активности предыдущие данные, и если бы он не запускал камеру. Это фиксировало проблему, когда иногда она застревала в бесконечном цикле съемки и возвращения в камеру.
  4. В результате других проблем, ошибки не всегда видели в моем нормальном тосте ошибки или в моем журнале (от отладчика иногда отсоединения) это сделало его гораздо сложнее для отладки, так как она была противоречивой.

    • То же, что и # 1.
+0

Re # 2: этот вопрос обсуждался здесь раньше, и были предоставлены хорошие образцы кода. –

+0

Я добавлю к этому, что у меня была очень похожая проблема (по крайней мере, у меня были точки # 2, # 3 и # 4), и просто перезагрузка телефона фиксировала почти все. По-видимому, что-то было с приложением камеры. –

Смежные вопросы