Android 模拟器中相机显示黑色

问题描述 投票:0回答:1

我编写了一个应用程序来显示相机并可能进行条形码扫描。相机视图只是黑色。知道可能是什么问题吗?尽管相机仍然没有显示,但没有错误。视图只是纯黑色。我添加了将相机移动到模拟器中的计算机相机的选项,当打开应用程序时,计算机中相机附近的小灯会亮起,所以看起来它正在工作。在这里添加我创建的一个迷你项目的代码,以重现问题而不会产生额外的噪音:

Java代码

public class MainActivity extends AppCompatActivity {

    private CameraSelector cameraSelector;
    private ListenableFuture<ProcessCameraProvider> cameraProvider;
    private ProcessCameraProvider processCameraProvider;
    private Preview cameraPreview;
    private ImageAnalysis imageAnalysis;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        if (ActivityCompat.checkSelfPermission(this, android.Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) {
            String[] cameraPermission = new String[] {Manifest.permission.CAMERA};
            ActivityCompat.requestPermissions(this, cameraPermission, 0);
        }
        findViewById(R.id.btn_start_camera).setOnClickListener(v ->
                initBarcodeScanner(findViewById(R.id.camera_preview)));
    }

    private void initBarcodeScanner(PreviewView previewView) {
        cameraSelector = new CameraSelector
                .Builder()
                .requireLensFacing(CameraSelector.LENS_FACING_BACK)
                .build();
        cameraProvider = ProcessCameraProvider.getInstance(this);

        cameraProvider.addListener(() -> {
            try {
                processCameraProvider = cameraProvider.get();
                cameraPreview = new Preview
                        .Builder()
                        .build();
                cameraPreview.setSurfaceProvider(previewView.getSurfaceProvider());

                BarcodeScanner barcodeScanner = BarcodeScanning.getClient(
                        new BarcodeScannerOptions
                                .Builder()
                                .setBarcodeFormats(Barcode.FORMAT_ALL_FORMATS)
                                .build()
                );
                imageAnalysis = new ImageAnalysis
                        .Builder()
                        .setTargetRotation(Surface.ROTATION_0)
                        .build();

                ExecutorService cameraExecutor = Executors.newSingleThreadExecutor();

                imageAnalysis.setAnalyzer(cameraExecutor, imageProxy ->
                        processImageProxy(barcodeScanner, imageProxy));

                processCameraProvider.bindToLifecycle(this, cameraSelector, imageAnalysis);

            } catch (ExecutionException | InterruptedException e) {
                e.printStackTrace();
            }
        }, ContextCompat.getMainExecutor(this));
    }


    @OptIn(markerClass = ExperimentalGetImage.class)
    private void processImageProxy(BarcodeScanner barcodeScanner, ImageProxy imageProxy) {
        if (imageProxy.getImage() != null) {
            InputImage inputImage = InputImage
                    .fromMediaImage(
                            imageProxy.getImage(),
                            imageProxy.getImageInfo().getRotationDegrees()
                    );
            barcodeScanner
                    .process(inputImage)
                    .addOnSuccessListener(barcodes -> {
                        if (!barcodes.isEmpty()) {
                            // todo handle barcodes read
                            Toast.makeText(this, barcodes.get(0).getDisplayValue(), Toast.LENGTH_SHORT).show();
                        }
                    })
                    .addOnFailureListener(Throwable::printStackTrace)
                    .addOnCompleteListener(results -> imageProxy.close());
        }
    }

}

布局文件

<?xml version="1.0" encoding="utf-8"?>
    <RelativeLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent">
    
        <androidx.camera.view.PreviewView
            android:id="@+id/camera_preview"
            android:layout_width="200dp"
            android:layout_height="200dp"
            android:layout_alignParentTop="true"
            android:layout_alignParentRight="true" />
    
        <Button
            android:id="@+id/btn_start_camera"
            android:layout_width="150dp"
            android:layout_height="80dp"
            android:text="start camera" />

    </RelativeLayout>

Gradle 依赖关系

dependencies {

    implementation 'androidx.appcompat:appcompat:1.6.1'
    implementation 'com.google.android.material:material:1.11.0'
    implementation 'androidx.constraintlayout:constraintlayout:2.1.4'
    implementation 'androidx.camera:camera-camera2:1.3.1'
    implementation 'androidx.camera:camera-lifecycle:1.3.1'
    implementation 'androidx.camera:camera-view:1.3.1'
    implementation 'com.google.mlkit:barcode-scanning:17.2.0'
    implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.9.10"
    implementation 'androidx.core:core-ktx:+'

    testImplementation 'junit:junit:4.13.2'
    androidTestImplementation 'androidx.test.ext:junit:1.1.5'
    androidTestImplementation 'androidx.test.espresso:espresso-core:3.5.1'
}

感谢您的帮助。

java android camera android-camera2
1个回答
0
投票

模拟器不支持摄像头。如果智能手机未连接到 PC 并且 PC 本身没有网络摄像头,应该如何工作? 但可能存在部分解决方案,请参阅此处

© www.soinside.com 2019 - 2024. All rights reserved.