0

まず、これは一般的に発生するエラーであり、これについて多くの質問があることを知っています。問題は、完全にシャットダウンして再起動した後に一度だけ発生し、デバッガーでは何が起こっているのかを調べることができないということです。

アクティビティを開始するコードは次のとおりです

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)

(行 238) にブレークポイントを配置してint i = 1;、次の数行をデバッグできるようにしましたが、デバッガーはそこで停止しません。このログでアプリケーションがクラッシュします。

try{} catch(Exception e){ e.printStackTrace();}CASEの中身の周りに を配置しました。アプリケーションがクラッシュすることはありませんが、写真の撮影を続行する代わりにアクティビティに戻り、写真はコレクションに追加されず、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

助けてください!

4

1 に答える 1

0

さて、このコード行でエラーが発生していました

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

デバッガーが停止できなかった理由はわかりませんが、NPE が発生している理由がわかりました。変数mediaTempは確かに null でした。これは、Android がアクティビティを破棄し、必要に応じて (写真を撮った後) 再作成していたためです。これは、Android アクティビティ ライフサイクルの文書化された動作です。起動後に一度だけ発生したのはなぜですか... Green Androidに聞いてみましょう。

解決策は、オーバーライドするかonSaveInstanceState、それに応じonRestoreInstanceState()て変更すること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>();
    }

これが、将来同様の問題を抱えている人に役立つことを願っています。

于 2013-10-03T12:37:09.677 に答える