我编写了一个应用程序来显示相机并可能进行条形码扫描。相机视图只是黑色。知道可能是什么问题吗?尽管相机仍然没有显示,但没有错误。视图只是纯黑色。我添加了将相机移动到模拟器中的计算机相机的选项,当打开应用程序时,计算机中相机附近的小灯会亮起,所以看起来它正在工作。在这里添加我创建的一个迷你项目的代码,以重现问题而不会产生额外的噪音:
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'
}
感谢您的帮助。
模拟器不支持摄像头。如果智能手机未连接到 PC 并且 PC 本身没有网络摄像头,应该如何工作? 但可能存在部分解决方案,请参阅此处。