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

Calling requestPermissions twice on custom kernel calls onRequestPermissionsResult before user response

我有一个项目在启动时要求 2 个权限。在调试中,它按预期工作,直到它第二次调用 requestPermissions。一旦它这样做,第一个就会用一个空的 grantResults 数组触发 onRequestPermissionsResult

就在今天之前,它还运行良好。我唯一能想到的就是我今天所做的更新。我更新到 Android SDK 平台工具 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 方法的不正确方法。所以每个人只要以正确的方式去做,它就会适用于所有设备:)

我期望两次连续调用 requestPermissions() 的最佳情况是出现两个连续但独立的对话框。我不希望您看到的行为。我以未正确处理配置更改的形式进行了类似的多次 requestPermissions() 调用,并且出现了两个版本的对话框。

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