关于在Android Studio中实现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 {

我曾尝试为CameraX实现预览,但代码中有两个错误无法解决:

  • CameraSelector在androidx.camera.core.CameraSelector中不是公共的。无法从包外部访问

  • 无法解析符号“previewView”

  • 编辑:我解决了问题,但仍然没有得到预览。我之前没有提到,但我在Android清单中插入了权限

    这是我的密码:

    MainActivity.java

    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();
                }
            }
        }