当前位置:  开发笔记 > Android > 正文

在用户响应之前,在自定义内核调用onRequestPermissionsResult上调用requestPermissions两次

如何解决《在用户响应之前,在自定义内核调用onRequestPermissionsResult上调用requestPermissions两次》经验,为你挑选了1个好方法。

我有一个项目,我在启动时要求2个权限.在调试中,它按预期工作,直到它进行第二次调用requestPermissions.一旦它发生,第一个onRequestPermissionsResult用空grantResults数组发射.

直到今天,这个工作正常.我唯一能想到的就是我今天所做的更新.我更新到Android SDK Platform Tools 23.1,并将我的Mac更新为El Capitan.

任何人都可以帮我解决任何问题吗?

代码如下:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.blank_layout);

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
        int hasCameraPermissions = checkSelfPermission(android.Manifest.permission.CAMERA);
        if (hasCameraPermissions != PackageManager.PERMISSION_GRANTED) {
            requestPermissions(new String[]{android.Manifest.permission.CAMERA}, REQUEST_CAMERA_PERMISSION_CODE);
        }
        int hasStoragePermissions = checkSelfPermission(android.Manifest.permission.WRITE_EXTERNAL_STORAGE);
        if (hasStoragePermissions != PackageManager.PERMISSION_GRANTED) {
            requestPermissions(new String[]{android.Manifest.permission.WRITE_EXTERNAL_STORAGE}, REQUEST_STORAGE_PERMISSION_CODE);
        }
        if (hasCameraPermissions == PackageManager.PERMISSION_GRANTED && hasStoragePermissions == PackageManager.PERMISSION_GRANTED) {
            startCameraIntent();
        }
    } else {
        startCameraIntent();
    }
}

@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
    switch (requestCode) {
        case REQUEST_CAMERA_PERMISSION_CODE:
            if (grantResults[0] != PackageManager.PERMISSION_GRANTED) {
                Toast.makeText(this, R.string.camera_denied, Toast.LENGTH_LONG).show();
                quitAfter5();
            }
            break;
        case REQUEST_STORAGE_PERMISSION_CODE:
            if (grantResults[0] != PackageManager.PERMISSION_GRANTED) {
                Toast.makeText(this, R.string.storage_denied, Toast.LENGTH_LONG).show();
                quitAfter5();
            }
            break;
    }
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
        int hasCameraPermissions = checkSelfPermission(android.Manifest.permission.CAMERA);
        int hasStoragePermissions = checkSelfPermission(android.Manifest.permission.WRITE_EXTERNAL_STORAGE);
        if (hasCameraPermissions == PackageManager.PERMISSION_GRANTED && hasStoragePermissions == PackageManager.PERMISSION_GRANTED) {
            startCameraIntent();
        }
    }
}

编辑::导致崩溃的变化是我几天前在我的Nexus 5上安装了自定义内核ElementalX的事实.我昨天在我兄弟的Nexus 6上使用相同的内核确认了这个问题.我将向内核开发人员发送一封电子邮件,以了解他对此的看法.

但是在答案中,上面的代码实际上是使用该requestPermissions方法的错误方法.所以每个人都以正确的方式做到这一点,它适用于所有设备:)



1> CommonsWare..:

我期望连续两次调用的最佳情况requestPermissions()是出现两个连续但不同的对话框.我不希望你看到的行为.我已经完成了类似的多次requestPermissions()调用,其形式是没有正确处理配置更改,并且两个版本的对话框都出现了.

在其他条件相同的情况下,您最好只是请求所有权限requestPermissions(),因此只有一个对话框.这样可以更好地满足用户的期望,我认为它可以简化您的代码.

推荐阅读
ifx0448363
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有