我有一个项目,其中要求启动2权限。在调试中,它会按预期工作,直到再次调用requestPermissions为止。一旦执行,第一个将使用空的onRequestPermissionsResult数组触发grantResults

直到今天为止,这一切都很好。我唯一能想到的就是我今天所做的更新。我更新了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()中的所有权限,因此只有一个对话框。这将更好地满足用户的期望,并且我认为这将简化您的代码。

关于android - 在用户响应之前,在自定义内核上两次调用requestPermissions会调用onRequestPermissionsResult,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/34324836/

10-11 22:31
查看更多