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

作者站长头像
站长
· 阅读数 10

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个回答
avatar
test
2024-06-24

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

 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;
    }
回复
likes
适合作为回答的
  • 经过验证的有效解决办法
  • 自己的经验指引,对解决问题有帮助
  • 遵循 Markdown 语法排版,代码语义正确
不该作为回答的
  • 询问内容细节或回复楼层
  • 与题目无关的内容
  • “赞”“顶”“同问”“看手册”“解决了没”等毫无意义的内容