android.permission.CAMERA 失败的问题

Problem with the android.permission.CAMERA failure

我正在尝试从 [Android 开发者网站][1] 实现 CameraX 预览,我不知道为什么即使我在我的清单中添加了权限也会出现此错误。当我打开 QR 扫描仪 activity 时,预览只是黑屏。我已经更新到最新版本的cameraX,但这个问题并没有解决。似乎没有授予使用相机的权限。请帮助我。

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.two_locally">

    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.CAMERA" />

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme"
        android:usesCleartextTraffic="true">
        <activity android:name=".QRScanner"></activity>
        <activity android:name=".UpdateInfo" />
        <activity android:name=".SellPayActivity" />
        <activity android:name=".my_listing_details" />
        <activity android:name=".my_qr_code" />
        <activity android:name=".my_aacount" />
        <activity android:name=".Dashbord" />
        <activity android:name=".user_verify" />
        <activity android:name=".sign_in" />
        <activity android:name=".register_information" />
        <activity android:name=".creat_password" />
        <activity android:name=".verification_otp_number" />
        <activity android:name=".register_mobile_number" />
        <activity android:name=".intro_steper" />
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>

二维码scanner.java

package com.example.two_locally;

import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.WindowManager;
import android.widget.ImageView;

import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import androidx.camera.core.Camera;
import androidx.camera.core.CameraSelector;
import androidx.camera.core.Preview;

import androidx.camera.lifecycle.ProcessCameraProvider;
import androidx.camera.view.PreviewView;
import androidx.core.content.ContextCompat;
import androidx.lifecycle.LifecycleOwner;

import com.google.common.util.concurrent.ListenableFuture;

import java.util.concurrent.ExecutionException;

public class QRScanner extends AppCompatActivity {
    ImageView back_image;
    private ListenableFuture<ProcessCameraProvider> cameraProviderFuture;
    PreviewView previewView;



    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_q_r_scanner);
        back_image = findViewById(R.id.back_img);
        previewView= findViewById(R.id.viewFinder);
        cameraProviderFuture = ProcessCameraProvider.getInstance(this);
        Log.i("Camerax", "preview view set up");
        back_image.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent r = new Intent(QRScanner.this, Dashbord.class);
                startActivity(r);
                finish();
            }
        });
        getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
        cameraProviderFuture.addListener(() -> {
            try {
                ProcessCameraProvider cameraProvider = cameraProviderFuture.get();
                Log.i("Camerax", "The CameraProvider is working now in try");
                bindPreview(cameraProvider);
            } catch (ExecutionException | InterruptedException e) {
                // No errors need to be handled for this Future.
                // This should never be reached.
                Log.i("Camerax", "The Camerax catch portion");
                e.printStackTrace();
            }
        }, ContextCompat.getMainExecutor(this));

    }




    void bindPreview(@NonNull ProcessCameraProvider cameraProvider) {
        Preview preview = new Preview.Builder()
                .build();

        CameraSelector cameraSelector = new CameraSelector.Builder()
                .requireLensFacing(CameraSelector.LENS_FACING_BACK)
                .build();

        preview.setSurfaceProvider(previewView.getSurfaceProvider());
        Log.i("Camerax", "bindPreview is working");
        Camera camera = cameraProvider.bindToLifecycle((LifecycleOwner)this, cameraSelector, preview);

    }

}

错误信息

```1 890-7480/? W/ServiceManager: Permission failure: android.permission.CAMERA from uid=10269 pid=2714
2020-12-08 14:29:28.262 890-7480/? E/CameraService: Permission Denial: can't use the camera pid=2714, uid=10269
2020-12-08 14:29:28.263 2714-3336/com.example.cameraApp E/SequentialExecutor: Exception while executing runnable androidx.camera.camera2.internal.-$$Lambda$Camera2CameraImpl$uJgH7DGqogXqd1JLV8-47UNTCjM@a1e8d7d
    java.lang.SecurityException: validateClientPermissionsLocked:1251: Caller "com.example.cameraApp" (PID 10269, UID 2714) cannot open camera "0" without camera permission
        at android.hardware.camera2.CameraManager.throwAsPublicException(CameraManager.java:827)
        at android.hardware.camera2.CameraManager.openCameraDeviceUserAsync(CameraManager.java:440)
        at android.hardware.camera2.CameraManager.openCameraForUid(CameraManager.java:622)
        at android.hardware.camera2.CameraManager.openCamera(CameraManager.java:590)
        at androidx.camera.camera2.internal.compat.CameraManagerCompatApi29Impl.openCamera(CameraManagerCompatApi29Impl.java:44)
        at androidx.camera.camera2.internal.compat.CameraManagerCompat.openCamera(CameraManagerCompat.java:203)
        at androidx.camera.camera2.internal.Camera2CameraImpl.openCameraDevice(Camera2CameraImpl.java:906)
        at androidx.camera.camera2.internal.Camera2CameraImpl.openInternal(Camera2CameraImpl.java:242)
        at androidx.camera.camera2.internal.Camera2CameraImpl.tryAttachUseCases(Camera2CameraImpl.java:709)
        at androidx.camera.camera2.internal.Camera2CameraImpl.lambda$attachUseCases$Camera2CameraImpl(Camera2CameraImpl.java:653)
        at androidx.camera.camera2.internal.-$$Lambda$Camera2CameraImpl$uJgH7DGqogXqd1JLV8-47UNTCjM.run(Unknown Source:4)
        at androidx.camera.core.impl.utils.executor.SequentialExecutor$QueueWorker.workOnQueue(SequentialExecutor.java:229)
        at androidx.camera.core.impl.utils.executor.SequentialExecutor$QueueWorker.run(SequentialExecutor.java:171)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641)
        at java.lang.Thread.run(Thread.java:919)
     Caused by: android.os.ServiceSpecificException: validateClientPermissionsLocked:1251: Caller "com.example.two_locally" (PID 10269, UID 2714) cannot open camera "0" without camera permission (code 1)
        at android.os.Parcel.createException(Parcel.java:2101)
        at android.os.Parcel.readException(Parcel.java:2055)
        at android.os.Parcel.readException(Parcel.java:2003)
        at android.hardware.ICameraService$Stub$Proxy.connectDevice(ICameraService.java:583)
        at android.hardware.camera2.CameraManager.openCameraDeviceUserAsync(CameraManager.java:403)
        at android.hardware.camera2.CameraManager.openCameraForUid(CameraManager.java:622) 
        at android.hardware.camera2.CameraManager.openCamera(CameraManager.java:590) 
        at androidx.camera.camera2.internal.compat.CameraManagerCompatApi29Impl.openCamera(CameraManagerCompatApi29Impl.java:44) 
        at androidx.camera.camera2.internal.compat.CameraManagerCompat.openCamera(CameraManagerCompat.java:203) 
        at androidx.camera.camera2.internal.Camera2CameraImpl.openCameraDevice(Camera2CameraImpl.java:906) 
        at androidx.camera.camera2.internal.Camera2CameraImpl.openInternal(Camera2CameraImpl.java:242) 
        at androidx.camera.camera2.internal.Camera2CameraImpl.tryAttachUseCases(Camera2CameraImpl.java:709) 
        at androidx.camera.camera2.internal.Camera2CameraImpl.lambda$attachUseCases$Camera2CameraImpl(Camera2CameraImpl.java:653) 
        at androidx.camera.camera2.internal.-$$Lambda$Camera2CameraImpl$uJgH7DGqogXqd1JLV8-47UNTCjM.run(Unknown Source:4) 
        at androidx.camera.core.impl.utils.executor.SequentialExecutor$QueueWorker.workOnQueue(SequentialExecutor.java:229) 
        at androidx.camera.core.impl.utils.executor.SequentialExecutor$QueueWorker.run(SequentialExecutor.java:171) 
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167) 
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641) 
        at java.lang.Thread.run(Thread.java:919) ```


  [1]: https://developer.android.com/training/camerax/preview

请确保您已在您的应用中接受相机许可。您可以通过转到设置 > 应用 > app_name > 权限

手动检查

然后将所有权限设置为授予!

还在您的清单文件中添加这一行:

<uses-feature android:name="android.hardware.camera.any" />

这只是确保设备有摄像头。指定.any 表示它可以是前置摄像头或后置摄像头。