#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, не сработало, но я мог что-то упустить.