android.content.Context.getPackageName()’ при нулевой ссылке на объект, при попытке получить доступ к методу в activity через класс Java

#java #firebase #android-intent #firebase-mlkit

# #java #firebase #android-intent #firebase-mlkit

Вопрос:

Я запускаю базовое приложение для распознавания лиц в режиме реального времени, и я подсчитываю, сколько раз оно обнаруживает лицо в FaceDetectionProcessor.java класс ( использовал это как ссылку -> https://github.com/firebase/quickstart-android/tree/master/mlkit/app/src/main/java/com/google/firebase/samples/apps/mlkit/java ) и при определенном значении счетчика он делает объект Действия, используя FaceDetectionProcessor.java объект для вызова метода для запуска новое действие, и вот оно выходит из строя.

попробовал FaceDetectActivity.this, просто this, getApplicationContext() , даже объект глобального контекста, который устанавливает его значение в «this» в onCreate() FaceDetectActivity

 public class FaceDetectActivity extends AppCompatActivity implements ActivityCompat.OnRequestPermissionsResultCallback,CompoundButton.OnCheckedChangeListener{
    private static final String FACE_DETECTION = "Face Detection";
    private static final String TAG = "LivePreviewActivity";
    private static final int PERMISSION_REQUESTS = 1;
    private CameraSource cameraSource = null;
    private CameraSourcePreview preview;
    private GraphicOverlay graphicOverlay;
    private String selectedModel = FACE_DETECTION;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
.
.
.
.
}


private void createCameraSource(String model) {
        // If there's no existing cameraSource, create one.
        if (cameraSource == null) {
            cameraSource = new CameraSource(this, graphicOverlay);
        }
        try {
            switch (model) {
                case FACE_DETECTION:
                    Log.i(TAG, "Using Face Detector Processor");
                    cameraSource.setMachineLearningFrameProcessor(new FaceDetectionProcessor());
                    break;
                default:
                    Log.e(TAG, "Unknown model: "   model);
            }
        } catch (Exception e) {
            Log.e(TAG, "can not create camera source: "   model);
        }
    }

public void alertAndMove(){
        Intent i=new Intent(FaceDetectActivity.this,SelectingParty.class);
        startActivity(i);
    }
 
 public class FaceDetectionProcessor extends VisionProcessorBase<List<FirebaseVisionFace>> {
    int count=0;

    private static final String TAG = "FaceDetectionProcessor";

    private final FirebaseVisionFaceDetector detector;

    public FaceDetectionProcessor() {
        FirebaseVisionFaceDetectorOptions options =
                new FirebaseVisionFaceDetectorOptions.Builder()
                        .setClassificationMode(FirebaseVisionFaceDetectorOptions.ALL_CLASSIFICATIONS)
                        .enableTracking()
                        .build();

        detector = FirebaseVision.getInstance().getVisionFaceDetector(options);
    }

    .
    .
    .
    . 
    . 
    .
    .

    @Override
    protected void onSuccess(
            @NonNull List<FirebaseVisionFace> faces,
            @NonNull FrameMetadata frameMetadata,
            @NonNull GraphicOverlay graphicOverlay) {
        graphicOverlay.clear();
        for (int i = 0; i < faces.size();   i) {
            FirebaseVisionFace face = faces.get(i);
            FaceGraphic faceGraphic = new FaceGraphic(graphicOverlay);
            graphicOverlay.add(faceGraphic);
            faceGraphic.updateFace(face, frameMetadata.getCameraFacing());
            Log.d(TAG, "onSuccess: Face detected and count= " count);
            count  ;
            if(count>=15)
                new FaceDetectActivity().alertAndMove();
        }
    }

    @Override
    protected void onFailure(@NonNull Exception e) {
        Log.e(TAG, "Face detection failed "   e);
    }
}
 

при вызове new FaceDetectActivity().alertAndMove() приложение завершает работу в alertAndMove() в строке Intent i=new Intent(FaceDetectActivity.this,……)

Что очень расстраивает в этой ситуации, так это то, что та же логика работала с тем же кодом на ноутбуке моих друзей, где я изначально тестировал логику.

Комментарии:

1. Это почти наверняка не то, что вы хотите сделать: new FaceDetectActivity().alertAndMove(); предполагается, что вы позволяете Android управлять экземплярами объектов activity — вы не создаете их самостоятельно.

Ответ №1:

В FaceDetectActivity я отправил намерение и контекст в FaceDetectionProcessor.java:

 case FACE_DETECTION:
                    Log.i(TAG, "Using Face Detector Processor");
                    Intent i=new Intent( this,SelectingParty.class);
                    cameraSource.setMachineLearningFrameProcessor(new FaceDetectionProcessor(this,i));
                    break;
 

И в конструкторе FaceDetectionProcessor.java Я инициализировал контекст экземпляра obj и намерение Intent следующим образом:

 public FaceDetectionProcessor(Context obj, Intent intent) {
        this.obj=obj;
        this.intent=intent;
.
.
.
 

Наконец, в методе onSuccess в FaceDetectionProcessor.java Я так и сделал:

 if(count>=15){
                obj.startActivity(intent);
            }
 

Вот и все! Однако я все еще не могу закрыть предыдущие действия, любые комментарии, предлагающие, как я мог бы достичь, были бы очень полезны!
PS Я пробовал CLEAR_TASK, CLEAR_TOP, NEW_TASK, не сработало, но я мог что-то упустить.