android.content.Context.getPackageName()' 在空对象引用上,当试图通过 java class 访问 activity 中的方法时
android.content.Context.getPackageName()' on a null object reference, when trying to access a method in an activity through a java class
我是 运行 一个基本的实时人脸检测应用程序,我正在计算它在 FaceDetectionProcessor.java class 中检测到人脸的次数(以此作为参考 - -> 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,简单地说,getApplicationContext(),甚至是一个全局上下文对象,它在 FaceDetectActivity[=17 的 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() 时,应用程序在 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 意图如下:
public FaceDetectionProcessor(Context obj, Intent intent) {
this.obj=obj;
this.intent=intent;
.
.
.
最后在 FaceDetectionProcessor.java 的 onSuccess 方法中我做了:
if(count>=15){
obj.startActivity(intent);
}
就是这样!但是我仍然无法关闭以前的活动,任何建议我如何实现的评论都会有很大帮助!
P.S。我尝试了 CLEAR_TASK、CLEAR_TOP、NEW_TASK,没有用,但我可能遗漏了一些东西。
我是 运行 一个基本的实时人脸检测应用程序,我正在计算它在 FaceDetectionProcessor.java class 中检测到人脸的次数(以此作为参考 - -> 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,简单地说,getApplicationContext(),甚至是一个全局上下文对象,它在 FaceDetectActivity[=17 的 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() 时,应用程序在 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 意图如下:
public FaceDetectionProcessor(Context obj, Intent intent) {
this.obj=obj;
this.intent=intent;
.
.
.
最后在 FaceDetectionProcessor.java 的 onSuccess 方法中我做了:
if(count>=15){
obj.startActivity(intent);
}
就是这样!但是我仍然无法关闭以前的活动,任何建议我如何实现的评论都会有很大帮助! P.S。我尝试了 CLEAR_TASK、CLEAR_TOP、NEW_TASK,没有用,但我可能遗漏了一些东西。