0

首先,我知道它的一個常見錯誤,並且存在很多關於這個錯誤的問題。問題是它只會在完全關閉並重新啓動後纔會發生,調試器將不會允許我檢查發生了什麼。重新啓動後 - 傳遞失敗結果ResultInfo {who = null,request = 742,result = -1,data = null}

這裏是啓動活動

protected File mediaTemp = null; 

private void addPictures() { 
    try { 
     // On prends et enregistre la photo 
     MediafileHelper mediaHelper = new MediafileHelper(this); 
     mediaTemp = mediaHelper 
       .createMediaFile(MediafileHelper.PICTURE_FILE_EXT); 
     Intent takePictureIntent = new Intent(
       MediaStore.ACTION_IMAGE_CAPTURE); 
     takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, 
       Uri.fromFile(mediaTemp)); 
     startActivityForResult(takePictureIntent, 
       MediafileHelper.PICTURE_ACTION_CODE); 

    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
} 

而且onActivityResult

protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
    int i = 1; 
    switch (requestCode) { 
     case MediafileHelper.PICTURE_ACTION_CODE: 
/*Line 240*/ if (resultCode == RESULT_OK && mediaTemp.exists()) { 
       // Ajout de l'image à la collection. 
       Mediafile mediaFile = new Mediafile(
         Mediafile.TYPE_PICTURE_JPG, mediaTemp); 
       mediaFile.setCaptureDatetime(new Date()); 
       mediaFile.setLocation(REAC.getLocationHelper() 
         .getCurrentLocation()); 
       medias.add(mediaFile); 
       addPictures(); 
      } else { 
       if (resultCode == RESULT_OK && !mediaTemp.exists()) { 
        // Le fichier n'a pas pu être créé pour une raison hors 
        // de notre contrôle. (Appel téléphonique ou autre) 
        Toast.makeText(this, 
          getString(R.string.mediafile_file_not_created), 
          Toast.LENGTH_LONG).show(); 
       } 

       // On rafraichis la liste des médias. 
       mediasFragment.getMediafileAdapter().notifyDataSetChanged(); 
      } 
      break; 

     case MediafileHelper.VIDEO_ACTION_CODE: 
     ... 
    } 
} 

最後,堆棧跟蹤

09-27 10:01:09.211 E/AndroidRuntime(4094): FATAL EXCEPTION: main 
09-27 10:01:09.211 E/AndroidRuntime(4094): java.lang.RuntimeException: Unable to resume activity {com.teops.qsl.reac/com.teops.qsl.reac.PicturesActivity}: java.lang.RuntimeException: Failure delivering result ResultInfo{who=null, request=742, result=-1, data=null} to activity {com.teops.qsl.reac/com.teops.qsl.reac.PicturesActivity}: java.lang.NullPointerException 
09-27 10:01:09.211 E/AndroidRuntime(4094): at android.app.ActivityThread.performResumeActivity(ActivityThread.java:2642) 
09-27 10:01:09.211 E/AndroidRuntime(4094): at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:2670) 
09-27 10:01:09.211 E/AndroidRuntime(4094): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2140) 
09-27 10:01:09.211 E/AndroidRuntime(4094): at android.app.ActivityThread.access$700(ActivityThread.java:143) 
09-27 10:01:09.211 E/AndroidRuntime(4094): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1241) 
09-27 10:01:09.211 E/AndroidRuntime(4094): at android.os.Handler.dispatchMessage(Handler.java:99) 
09-27 10:01:09.211 E/AndroidRuntime(4094): at android.os.Looper.loop(Looper.java:137) 
09-27 10:01:09.211 E/AndroidRuntime(4094): at android.app.ActivityThread.main(ActivityThread.java:4967) 
09-27 10:01:09.211 E/AndroidRuntime(4094): at java.lang.reflect.Method.invokeNative(Native Method) 
09-27 10:01:09.211 E/AndroidRuntime(4094): at java.lang.reflect.Method.invoke(Method.java:511) 
09-27 10:01:09.211 E/AndroidRuntime(4094): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1011) 
09-27 10:01:09.211 E/AndroidRuntime(4094): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:778) 
09-27 10:01:09.211 E/AndroidRuntime(4094): at dalvik.system.NativeStart.main(Native Method) 
09-27 10:01:09.211 E/AndroidRuntime(4094): Caused by: java.lang.RuntimeException: Failure delivering result ResultInfo{who=null, request=742, result=-1, data=null} to activity {com.teops.qsl.reac/com.teops.qsl.reac.PicturesActivity}: java.lang.NullPointerException 
09-27 10:01:09.211 E/AndroidRuntime(4094): at android.app.ActivityThread.deliverResults(ActivityThread.java:3208) 
09-27 10:01:09.211 E/AndroidRuntime(4094): at android.app.ActivityThread.performResumeActivity(ActivityThread.java:2629) 
09-27 10:01:09.211 E/AndroidRuntime(4094): ... 12 more 
09-27 10:01:09.211 E/AndroidRuntime(4094): Caused by: java.lang.NullPointerException 
09-27 10:01:09.211 E/AndroidRuntime(4094): at com.teops.qsl.reac.mediafile.MediafileActivity.onActivityResult(MediafileActivity.java:240) 
09-27 10:01:09.211 E/AndroidRuntime(4094): at android.app.Activity.dispatchActivityResult(Activity.java:5344) 
09-27 10:01:09.211 E/AndroidRuntime(4094): at android.app.ActivityThread.deliverResults(ActivityThread.java:3204) 
09-27 10:01:09.211 E/AndroidRuntime(4094): ... 13 more 
09-27 10:01:26.660 D/ActivityThread(4363): setTargetHeapUtilization:0.25 
09-27 10:01:26.660 D/ActivityThread(4363): setTargetHeapIdealFree:8388608 
09-27 10:01:26.660 D/ActivityThread(4363): setTargetHeapConcurrentStart:2097152 
09-27 10:01:26.740 D/LocationHelper(4363): Location : Location[mProvider=network,mTime=1380290486532,mLatitude=46.7949937,mLongitude=-71.2240393,mHasAltitude=false,mAltitude=0.0,mHasSpeed=false,mSpeed=0.0,mHasBearing=false,mBearing=0.0,mHasAccuracy=true,mAccuracy=20.0,mExtras=Bundle[mParcelledData.dataSize=148]] 
09-27 10:01:27.010 I/Adreno200-EGLSUB(4363): <ConfigWindowMatch:2136>: Format RGBA_8888. 
09-27 10:01:27.020 E/  (4363): <s3dReadConfigFile:75>: Can't open file for reading 
09-27 10:01:27.020 E/  (4363): <s3dReadConfigFile:75>: Can't open file for reading 

所以人會告訴我,什麼是代碼有錯誤

09-27 10:01:09.211 E/AndroidRuntime(4094): Caused by: java.lang.NullPointerException 
09-27 10:01:09.211 E/AndroidRuntime(4094): at com.teops.qsl.reac.mediafile.MediafileActivity.onActivityResult(MediafileActivity.java:240) 

我在int i = 1;(第238行)放置了一個斷點,可以調試接下來的幾行代碼,但調試器不會停在那裏,我的應用程序會崩潰。

我在CASE的內容周圍放置了一個try{} catch(Exception e){ e.printStackTrace();}。它不會使應用程序崩潰,但不會繼續拍攝照片,而是返回到Activity,照片不會添加到集合中,並且StackTrace不會打印。 e.printStackTrace()上的制動點不制動。

  try { 
       // Résultat de "Prise de photo" 
       if (resultCode == RESULT_OK && mediaTemp.exists()) { 
        // Ajout de l'image à la collection. 
        Mediafile mediaFile = new Mediafile(
          Mediafile.TYPE_PICTURE_JPG, mediaTemp); 
        mediaFile.setCaptureDatetime(new Date()); 
        mediaFile.setLocation(REAC.getLocationHelper() 
          .getCurrentLocation()); 
        medias.add(mediaFile); 
        addPictures(); 
       } else { 
        if (resultCode == RESULT_OK && !mediaTemp.exists()) { 
         // Le fichier n'a pas pu être créé pour une raison 
         // hors 
         // de notre contrôle. (Appel téléphonique ou autre) 
         Toast.makeText(
           this, 
           getString(R.string.mediafile_file_not_created), 
           Toast.LENGTH_LONG).show(); 
        } 

        // On rafraichis la liste des médias. 
        mediasFragment.getMediafileAdapter() 
          .notifyDataSetChanged(); 
       } 
      } catch (Exception e) { 
       e.printStackTrace(); 
      } 

在任何情況下,圖片保存在由mediaTemp表示的文件中。

請幫助!

回答

0

那麼,錯誤是存在的這一行代碼

if (resultCode == RESULT_OK && !mediaTemp.exists()) { 

我不知道爲什麼調試器無法阻止,但我發現爲什麼NPE是存在的原因。 變量mediaTemp確實爲空。其原因是Android正在摧毀我的活動並在需要時重新創建它(照片拍攝後)。它是android活動生命週期的記錄行爲。爲什麼只有在啓動後纔會發生一次......讓我們問一下Green Android。

解決方案是覆蓋onSaveInstanceStateonRestoreInstanceState()或相應地更改onCreate

首先,你保存在活動被破壞或停止的重要數據:

@Override 
protected void onSaveInstanceState(Bundle outState) { 
    super.onSaveInstanceState(outState); 

    // Enregistrement du fichier temporaire. 
    if (mediaTemp != null) { 
     outState.putSerializable(MEDIATEMP_FILE_BUNDLE, mediaTemp); 
    } 

    // Enregistrement de la liste de Mediafiles. 
    if (medias != null && medias.size() != 0) { 
     outState.putParcelableArrayList(MEDIAS_LIST_BUNDLE, medias); 
    } 

} 

你要麼加載在onRestoreInstanceState()或像我一樣,管理它在onCreate

// Restauration des données enregistrées, si applicable. 
    if (savedInstanceState != null) { 
     // Restauration du fichier temporaire. 
     if (savedInstanceState.containsKey(MEDIATEMP_FILE_BUNDLE)) { 
      mediaTemp = (File) savedInstanceState 
        .getSerializable(MEDIATEMP_FILE_BUNDLE); 
     } 

     // Restauration de la liste de Mediafiles. 
     if (savedInstanceState.containsKey(MEDIAS_LIST_BUNDLE)) { 
      medias = savedInstanceState 
        .getParcelableArrayList(MEDIAS_LIST_BUNDLE); 
     } 
    } else { 
     // Données par défaut 
     medias = new ArrayList<Mediafile>(); 
    } 

我希望這可以幫助將來有類似問題的人。

相關問題