Получение NullPointerException в контексте - PullRequest
0 голосов
/ 01 марта 2019

Я хочу запустить программу в Android Studio, но я получил эту ошибку.

java.lang.NullPointerException: Attempt to invoke virtual method 'android.content.pm.ApplicationInfo android.content.Context.getApplicationInfo()' on a null object reference
    at android.content.ContextWrapper.getApplicationInfo(ContextWrapper.java:152)
    at android.view.ContextThemeWrapper.getTheme(ContextThemeWrapper.java:157)
    at android.app.AlertDialog.resolveDialogTheme(AlertDialog.java:224)
    at android.app.AlertDialog$Builder.<init>(AlertDialog.java:454)
    at com.example.drowzy.LivePreviewActivity.drowzy_alert(LivePreviewActivity.java:219)
    at com.example.drowzy.LivePreviewActivity.eye_tracking(LivePreviewActivity.java:212)
    at com.example.drowzy.FaceDetectionProcessor.onSuccess(FaceDetectionProcessor.java:90)
    at com.example.drowzy.FaceDetectionProcessor.onSuccess(FaceDetectionProcessor.java:38)
    at com.example.drowzy.VisionProcessorBase$2.onSuccess(VisionProcessorBase.java:114)
    at com.google.android.gms.tasks.zzn.run(Unknown Source:4)
    at android.os.Handler.handleCallback(Handler.java:789)
    at android.os.Handler.dispatchMessage(Handler.java:98)
    at android.os.Looper.loop(Looper.java:251)
    at android.app.ActivityThread.main(ActivityThread.java:6572)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:240)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:767)

Он говорит, что мой контекст нулевой.Я пробовал возможное решение в Google, но он не работает.Мой способ инициализации контекста неверен?Могу ли я вызвать метод drowzy_alert в другом классе без указанного контекста в FaceDetectionProcessor?

Это мой LivePreviewActivity

public void eye_tracking(@NonNull FirebaseVisionFace face){
    if (face.getRightEyeOpenProbability() < 0.1 && face.getLeftEyeOpenProbability() < 0.1) {
        drowzy_alert();
    }
}

public void drowzy_alert(){

    // Use the Builder class for convenient dialog construction
    AlertDialog.Builder builder = new AlertDialog.Builder(this);
    builder.setMessage("Drowzy Detected")
            .setPositiveButton("Yes", new DialogInterface.OnClickListener() {
                public void onClick(DialogInterface dialog, int id) {
                    // FIRE ZE MISSILES!
                }
            })
            .setNegativeButton("No", new DialogInterface.OnClickListener() {
                public void onClick(DialogInterface dialog, int id) {
                    // User cancelled the dialog
                }
            });
    // Create the AlertDialog object and return it
    builder.create();
}

, а это мой FaceDetectionProcessor

protected void onSuccess(
        @Nullable Bitmap originalCameraImage,
        @NonNull List<FirebaseVisionFace> faces,
        @NonNull FrameMetadata frameMetadata,
        @NonNull GraphicOverlay graphicOverlay
) {

    graphicOverlay.clear();
    if (originalCameraImage != null) {
        CameraImageGraphic imageGraphic = new CameraImageGraphic(graphicOverlay, originalCameraImage);
        graphicOverlay.add(imageGraphic);
    }
    for (int i = 0; i < faces.size(); ++i) {
        FirebaseVisionFace face = faces.get(i);

        int cameraFacing =
                frameMetadata != null ? frameMetadata.getCameraFacing() :
                        Camera.CameraInfo.CAMERA_FACING_BACK;
        FaceGraphic faceGraphic = new FaceGraphic(graphicOverlay, face, cameraFacing);
        LivePreviewActivity livePreviewActivity = new LivePreviewActivity();
        graphicOverlay.add(faceGraphic);
        livePreviewActivity.eye_tracking(face);
    }
    graphicOverlay.postInvalidate();
}

1 Ответ

0 голосов
/ 01 марта 2019
LivePreviewActivity livePreviewActivity = new LivePreviewActivity();

Вы не можете создать экземпляр LivePreviewActivity таким образом.Если у вас есть действие, вы можете использовать только startActivity или какой-либо другой метод контекста, который управляется android.

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

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

Исходя из того, что я понял, вам придется перенести всю эту логику на одно действие, а не разделять его на два.Если вы хотите загрузить несколько действий одновременно, рассмотрите возможность использования фрагментов.

...