我目前正在尝试使用ML Kit和本地Firebase框架来检测和分析人脸。
我有一个画廊活动,用户可以选择一个图像,然后转到另一个活动,在该活动中显示所选图像并分析人脸(我将代码简化为使问题更清楚):
private void classifyFaces(final Bitmap bitmap){
FirebaseVisionImage image = FirebaseVisionImage.fromBitmap(bitmap);
Task<List<FirebaseVisionFace>> result =
detector.detectInImage(image)
.addOnSuccessListener(
new OnSuccessListener<List<FirebaseVisionFace>>() {
@Override
public void onSuccess(List<FirebaseVisionFace> faces) {
// Task completed successfully
// Do face analysis tasks here.
})
.addOnFailureListener(
new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception e) {
// Task failed with an exception
// ...
}
});
}
如果此代码位于各自的活动类中,则该代码可以正常工作。然后,我重写了classifyFaces方法以返回分析结果,并将其移动到单独的程序包中。然后我从我的活动中调用了新创建的类,但再也没有返回值。
我认为这与Firebase任务的工作方式以及在OnSuccessListener被触发之前返回classifyFaces方法有关。
我尝试了其他方法,例如将DisplayImage活动传递给addOnSuccessListener方法,但是它不起作用。
我该如何解决?
答案 0 :(得分:1)
原因是任务正在异步运行。因此,您的方法只是启动Task并在完成之前返回。
也许您可以使您的方法返回一个Task。然后,您可以在调用活动中注册onCompleteListener。