android 申请相机权限没有弹出授权对话框怎么办?

android api level 29的设备上首次安装申请相机权限,没有弹出授权的对话框怎么办?

已经在清单文件中声明相机权限

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

并且声明了与相机应用的交互规则:

<queries>
      <intent>
        <action android:name="android.media.action.IMAGE_CAPTURE"/>
    </intent>
      <intent>
        <action android:name="android.media.action.VIDEO_CAPTURE"/>
    </intent>
</queries>

然后在需要使用相机的地方也动态申请了相机授权,但是死活不弹出相机授权对话框(应用首次安装或者卸载重装都如此)。

public class TestActivity extends AppCompatActivity {
    private ActivityResultLauncher<Intent> faceActivityResultLauncher;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        // ... 省略代码
        
        this.faceActivityResultLauncher = this.registerForActivityResult(
            new ActivityResultContracts.StartActivityForResult(), 
            result -> {
                if (result.getResultCode() != Activity.RESULT_OK) {
                    UiCommon.toast(this, "相机拍摄失败");
                    return ;
                }
                this.updateFace(this.face);
            }
        );
        // 申请授权
        ActivityCompat.requestPermissions(this, new String[] {Manifest.permission.CAMERA}, TEST_CODE);

    }

    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        boolean isGranted = PermissionCommon.permissionResultHandle(this, requestCode, permissions, grantResults);
        switch (requestCode) {
            case TEST_CODE:
                if (!isGranted) {
                    // 省略部分代码 ... 
                     Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
                     intent.putExtra(MediaStore.EXTRA_OUTPUT, uri);
                     this.faceActivityResultLauncher.launch(intent);
                }
                break;
            default:
                break;
        }
    }
}

这是为什么?该如何解决上述问题?

阅读 1.5k
1 个回答

问题已解决,是连续申请权限导致的。上述代码没贴完整,问题如下:

 public boolean checkPermissions() {
        PermissionCommon.requestStoragePermissions(this.activity);
        PermissionCommon.requestCameraPermissions(this.activity);
        if (!PermissionCommon.isHasStoragePermission(this.activity)) {
            UiCommon.toast(this.activity, "无文件存取权限");
            return false;
        }
        if (!PermissionCommon.isHasCameraPermission(this.activity)) {
            UiCommon.toast(this.activity, "无相机权限");
            return false;
        }
        return true;
    }

将权限合成一下一次性申请就可以了。

 public boolean checkPermissions() {
        // 将存储和拍照权限合在一起申请
        String[] permissions = new string[] {...};
        PermissionCommon.requestPermissions(this.activity, permissions);
        if (!PermissionCommon.isHasPermissions(this.activity, permissions)) {
            UiCommon.toast(this.activity, "部分或全部权限未授予");
            return false;
        }
        return true;
    }
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题