我有一个项目,其中要求启动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/