Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/209.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将AndroidX摄像头与MLKit一起使用时,inputImage.getByteBuffer()为空_Android_Androidx_Firebase Mlkit_Firebase Machine Learning - Fatal编程技术网

将AndroidX摄像头与MLKit一起使用时,inputImage.getByteBuffer()为空

将AndroidX摄像头与MLKit一起使用时,inputImage.getByteBuffer()为空,android,androidx,firebase-mlkit,firebase-machine-learning,Android,Androidx,Firebase Mlkit,Firebase Machine Learning,这是我的活动类中的代码: @Override protected void onCreate(Bundle savedInstanceState) { requestWindowFeature(Window.FEATURE_NO_TITLE); super.onCreate(savedInstanceState); _cpf = ProcessCameraProvider.getInstance(this); _c

这是我的活动类中的代码:

    @Override protected void onCreate(Bundle savedInstanceState)
    {
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        super.onCreate(savedInstanceState);

        _cpf = ProcessCameraProvider.getInstance(this);
        _cpf.addListener(new Runnable() {
            @Override
            public void run() {
                try {
                    ProcessCameraProvider cameraProvider = _cpf.get();
                    bindImageAnalysis(cameraProvider);
                } catch (ExecutionException | InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }, ContextCompat.getMainExecutor(this));
    }

    private void bindImageAnalysis(@NonNull ProcessCameraProvider cameraProvider) {
        ImageAnalysis imageAnalysis =
                new ImageAnalysis.Builder().setTargetResolution(new Size(640, 360))
                        .setBackpressureStrategy(ImageAnalysis.STRATEGY_KEEP_ONLY_LATEST).build();
        imageAnalysis.setAnalyzer(ContextCompat.getMainExecutor(this), new ImageAnalysis.Analyzer() {
            @Override
            public void analyze(@NonNull ImageProxy ip) {
                processImage(ip.getImage(), ip.getImageInfo().getRotationDegrees());
                ip.close();
            }
        });
        CameraSelector cameraSelector = new CameraSelector.Builder().requireLensFacing(CameraSelector.LENS_FACING_BACK).build();
        cameraProvider.bindToLifecycle((LifecycleOwner)this, cameraSelector, imageAnalysis);
    }
在每个
analyze
回调中,MLKit都指示
InputImage.fromMediaImage(ip.getImage(),ip.getImageInfo().getRotationDegrees()).getByteBuffer()为空。我该如何解释呢?这是否总是意味着映像为空?

inputImage.getByteBuffer()是一个内部方法,它不是为公共用途而设计的。此方法仅在使用bytebuffer或字节数组构造图像时返回。如果您需要从android媒体图像中使用bytebuffer,您需要自己进行转换


此外,我们对Firebase ML Kit进行了一些更改,以更好地区分设备上的API和基于云的API。“”(不带firebase品牌)包含所有设备上的API。firebase mlkit到mlkit的迁移指南。所有进一步的改进和新的API都将仅与新的ML工具包一起发布。

问题在于我过早地使用了
.close()
ng
PoseDetector
处理是异步的,因此正在调用
processImage
,并在
ip.close()之后立即调用。调用
ip.close()
时,processImage仍在工作,因此这就是
尝试调用虚拟方法“java.nio.ByteBuffer android.media.Image$Plane.getBuffer()的原因。与其在
analyze
方法中使用
.close()
,不如在
OnSuccessListener
OnSuccessListener
的末尾调用它


这是完整的。

OnFailureListener
中,我得到了
com.google.mlkit.common.mlkit异常:执行ML Kit任务时发生内部错误
。错误.getCause()返回
java.lang.NullPointerException:尝试在空对象引用上调用虚拟方法“java.nio.ByteBuffer android.media.Image$Plane.getBuffer()”。为了更好地理解这一点,在使用
InputImage.fromMediaImage()
构造函数时会发生此错误。我添加了
firebase机器学习
标记只是为了增加得到回答的机会。我使用的是没有firebase品牌的MLKit版本。