【问题标题】:android.content.Context.getPackageName()' on a null object reference, when trying to access a method in an activity through a java classandroid.content.Context.getPackageName()' 在空对象引用上,当尝试通过 java 类访问活动中的方法时
【发布时间】:2019-04-15 22:22:08
【问题描述】:

我正在实时运行一个基本的人脸检测应用程序,我正在计算它在 FaceDetectionProcessor.java 类中检测到人脸的次数(用作参考 --> https://github.com/firebase/quickstart-android/tree/master/mlkit/app/src/main/java/com/google/firebase/samples/apps/mlkit/java )和特定的计数值它使用 FaceDetectionProcessor.java 对象创建一个 Activity 对象来调用一个方法来启动一个新的 Activity,然后它就崩溃了。

尝试过 FaceDetectActivity.this,简单的 this,getApplicationContext(),甚至是一个全局 Context 对象,它在 FaceDetectActivity 的 onCreate() 中将其值设置为“this”

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() 时,应用程序会在 Intent i=new Intent(FaceDetectActivity.this,......) 行的 alertAndMove() 中崩溃

这种情况非常令人沮丧的是,相同的逻辑在我最初测试逻辑的朋友笔记本电脑上运行在相同的代码上。

【问题讨论】:

  • 这几乎肯定不是你想要做的:new FaceDetectActivity().alertAndMove(); 你应该让 Android 控制活动对象实例 - 你不要自己创建它们。

标签: java firebase android-intent firebase-mlkit


【解决方案1】:

在 FaceDetectActivity 中,我将 Intent 和上下文发送到 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 的构造函数中,我初始化了实例 Context obj 和 Intent Intent,如下所示:

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

最后在 FaceDetectionProcessor.java 的 onSuccess 方法中我做了:

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

就是这样!我但是仍然无法关闭以前的活动,任何建议我如何实现的cmets都会有很大帮助! 附言我尝试了 CLEAR_TASK、CLEAR_TOP、NEW_TASK,但没有奏效,但我可能遗漏了一些东西。

【讨论】:

    猜你喜欢
    • 2017-09-01
    • 1970-01-01
    • 2015-04-15
    • 2018-12-05
    • 2018-10-29
    • 1970-01-01
    • 2021-07-01
    • 1970-01-01
    相关资源
    最近更新 更多