关于在Android Studio中实现CameraX预览的问题
我曾尝试为CameraX实现预览,但代码中有两个错误无法解决:关于在Android Studio中实现CameraX预览的问题,android,android-studio,android-camerax,Android,Android Studio,Android Camerax,我曾尝试为CameraX实现预览,但代码中有两个错误无法解决: CameraSelector在androidx.camera.core.CameraSelector中不是公共的。无法从包外部访问 无法解析符号“previewView” 编辑:我解决了问题,但仍然没有得到预览。我之前没有提到,但我在Android清单中插入了权限 这是我的密码: MainActivity.java public class MainActivity extends AppCompatActivity {
public class MainActivity extends AppCompatActivity {
private ListenableFuture<ProcessCameraProvider> cameraProviderFuture;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
PreviewView previewView = (PreviewView) findViewById(R.id.previewView);
cameraProviderFuture = ProcessCameraProvider.getInstance(this);
cameraProviderFuture.addListener(() -> {
try {
ProcessCameraProvider cameraProvider = cameraProviderFuture.get();
Preview preview = new Preview.Builder().build();
CameraSelector cameraSelector = new CameraSelector.Builder().requireLensFacing(CameraSelector.LENS_FACING_BACK).build();
preview.setSurfaceProvider(previewView.createSurfaceProvider());
cameraProvider.unbindAll();
cameraProvider.bindToLifecycle((LifecycleOwner)this, cameraSelector, preview);
} catch (ExecutionException | InterruptedException e) {
e.printStackTrace();
}
}, ContextCompat.getMainExecutor(this));
}
}
activity_main.xml
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<androidx.camera.view.PreviewView
android:id="@+id/previewView"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</RelativeLayout>
根据日志,我没有插入相机许可,但我会这样做。也许我错过了其他权限?根据Husayn和Shark的建议,我已经解决了这个问题。任何具有Android 6或更高版本(API 23+)的设备都需要运行时权限 检查用户是否已授予相机权限。否则,请请求该许可。在调用CameraX代码之前,在
onCreate()
方法中插入以下代码:
if (checkSelfPermission(Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) {
requestPermissions(new String[]{Manifest.permission.CAMERA}, CAMERA_REQUEST);
}
其中,CAMERA\u REQUEST
是一个常量。下面是一个例子:
private static final int CAMERA_REQUEST = 100;
然后,它将出现一个对话框,用户可以在其中允许或拒绝权限。我们可以通过以下方法看到结果:
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
if (requestCode == CAMERA_REQUEST) {
if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
Toast.makeText(this, "CameraX permission granted", Toast.LENGTH_SHORT).show();
} else {
Toast.makeText(this, "CameraX permission denied", Toast.LENGTH_SHORT).show();
}
}
}
您可以在运行应用程序时共享日志吗?另外,如果您在API级别23或更高版本上运行的设备上进行测试,是否在运行时请求摄像头权限?谢谢您的回复,@Husayn Hakeem。我有两个设备:一个是安卓9(API 28),另一个是安卓5.1(API 22)。对于我的项目,我需要两个设备。目前,我只在第一台设备上运行我的应用程序。我试图在我的帖子中添加日志(错误):我是Android studio的新手,所以我不确定我是否得到了你的要求。照相机不是运行时权限吗?oyu在调用CameraX代码之前是否请求该权限?谢谢@Shark。现在它工作了!我不添加运行时权限。也谢谢你,Husayn@Mata2907请随意将其作为答案发布,然后接受它。我听说有徽章可以回答你自己的问题;)
private static final int CAMERA_REQUEST = 100;
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
if (requestCode == CAMERA_REQUEST) {
if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
Toast.makeText(this, "CameraX permission granted", Toast.LENGTH_SHORT).show();
} else {
Toast.makeText(this, "CameraX permission denied", Toast.LENGTH_SHORT).show();
}
}
}