CameraX PreviewView 什么都不显示
CameraX PreviewView showing nothing
我遵循了这些教程:
https://developer.android.com/training/camerax/preview,
https://proandroiddev.com/update-android-camerax-4a44c3e4cdcc
我第一次 运行 app 预览工作,但在我旋转屏幕后全部坏了。我重新安装了应用程序,但预览不再有效
public class ScanActivity extends AppCompatActivity {
private ListenableFuture<ProcessCameraProvider> cameraProviderFuture;
private PreviewView cameraView;
private Preview imagePreview;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_scan);
cameraView = findViewById(R.id.cameraView);
cameraProviderFuture = ProcessCameraProvider.getInstance(this);
if(isPermissionsGranted()){
cameraView.post(new Runnable() {
@Override
public void run() {
startCamera();
}
});
}
else{
ActivityCompat.requestPermissions(ScanActivity.this,
new String[]{Manifest.permission.CAMERA},PERMISSION_REQUEST_CODE);
}
}
private void startCamera(){
imagePreview = new Preview.Builder()
.setTargetRotation(cameraView.getDisplay().getRotation())
.build();
imagePreview.setSurfaceProvider(cameraView.getPreviewSurfaceProvider());
final CameraSelector cameraSelector = new CameraSelector.Builder()
.requireLensFacing(CameraSelector.LENS_FACING_BACK)
.build();
cameraProviderFuture.addListener(() -> {
try {
ProcessCameraProvider cameraProvider = cameraProviderFuture.get();
cameraProvider.bindToLifecycle(ScanActivity.this,cameraSelector,imagePreview);
} catch (ExecutionException|InterruptedException e) {
e.printStackTrace();
}
},ContextCompat.getMainExecutor(this));
}
}
不应在相机初始化之前构建用例,这是 ProcessCameraProvider.getInstance()
异步执行的操作。因此,您可能 运行 进入的是在初始化完成之前构建的预览用例,这就是预览不起作用的原因。您的代码应该如下所示。
cameraProviderFuture.addListener(() -> {
try {
ProcessCameraProvider cameraProvider = cameraProviderFuture.get(context);
Preview preview = new Preview.Builder().build();
preview.setSurfaceProvider(previewView.getSurfaceProvider());
cameraProvider.bindToLifecycle(lifecycleOwner, selector, preview);
} catch (Exception exception) {
exception.printStackTrace();
}
}, ContextCompat.getMainExecutor(context));
我遵循了这些教程: https://developer.android.com/training/camerax/preview, https://proandroiddev.com/update-android-camerax-4a44c3e4cdcc 我第一次 运行 app 预览工作,但在我旋转屏幕后全部坏了。我重新安装了应用程序,但预览不再有效
public class ScanActivity extends AppCompatActivity {
private ListenableFuture<ProcessCameraProvider> cameraProviderFuture;
private PreviewView cameraView;
private Preview imagePreview;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_scan);
cameraView = findViewById(R.id.cameraView);
cameraProviderFuture = ProcessCameraProvider.getInstance(this);
if(isPermissionsGranted()){
cameraView.post(new Runnable() {
@Override
public void run() {
startCamera();
}
});
}
else{
ActivityCompat.requestPermissions(ScanActivity.this,
new String[]{Manifest.permission.CAMERA},PERMISSION_REQUEST_CODE);
}
}
private void startCamera(){
imagePreview = new Preview.Builder()
.setTargetRotation(cameraView.getDisplay().getRotation())
.build();
imagePreview.setSurfaceProvider(cameraView.getPreviewSurfaceProvider());
final CameraSelector cameraSelector = new CameraSelector.Builder()
.requireLensFacing(CameraSelector.LENS_FACING_BACK)
.build();
cameraProviderFuture.addListener(() -> {
try {
ProcessCameraProvider cameraProvider = cameraProviderFuture.get();
cameraProvider.bindToLifecycle(ScanActivity.this,cameraSelector,imagePreview);
} catch (ExecutionException|InterruptedException e) {
e.printStackTrace();
}
},ContextCompat.getMainExecutor(this));
}
}
不应在相机初始化之前构建用例,这是 ProcessCameraProvider.getInstance()
异步执行的操作。因此,您可能 运行 进入的是在初始化完成之前构建的预览用例,这就是预览不起作用的原因。您的代码应该如下所示。
cameraProviderFuture.addListener(() -> {
try {
ProcessCameraProvider cameraProvider = cameraProviderFuture.get(context);
Preview preview = new Preview.Builder().build();
preview.setSurfaceProvider(previewView.getSurfaceProvider());
cameraProvider.bindToLifecycle(lifecycleOwner, selector, preview);
} catch (Exception exception) {
exception.printStackTrace();
}
}, ContextCompat.getMainExecutor(context));