![](/img/trans.png)
[英]app crash with android.content.Context.getPackageName()' on a null object reference
[英]android.content.Context.getPackageName()' on a null object reference, when trying to access a method in an activity through a java class
我正在實時運行一個基本的人臉檢測應用程序,並計算它在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的對象一種啟動新活動的方法,然后崩潰。
嘗試了FaceDetectActivity.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);
}
}
當調用新的FaceDetectActivity()。alertAndMove()時,應用程序在alertAndMove()中的行Intent i = new Intent(FaceDetectActivity.this,......)崩潰
對於這種情況非常令人沮喪的是,相同的邏輯在我最初測試邏輯的朋友筆記本電腦上運行相同的代碼。
在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);
}
而已 ! 我仍然無法關閉以前的活動,任何建議我如何實現的評論都會有很大的幫助! PS我試過CLEAR_TASK,CLEAR_TOP,NEW_TASK,沒用,但我可能會遺漏一些東西。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.