我有一个项目,我在启动时要求2个权限。在调试中,它按预期工作,直到它对requestPermissions
进行第二次调用。一旦它发生,第一个用onRequestPermissionsResult
数组空grantResults
。{/ p>
直到今天,这个工作正常。我唯一能想到的就是我今天所做的更新。我更新到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();
}
}
}
EDIT :: 导致崩溃的变化是我几天前在我的Nexus 5上安装了自定义内核ElementalX的事实。我昨天在我兄弟的Nexus 6上使用相同的内核确认了这个问题。我将向内核开发人员发送一封电子邮件,以了解他对此的看法。
在答案中,上面的代码实际上是使用requestPermissions
方法的错误方法。所以每个人都以正确的方式做到这一点,它适用于所有设备:)
答案 0 :(得分:5)
我期望连续两次调用requestPermissions()
的最佳情况是出现两个连续但不同的对话框。我不希望你看到的行为。我已经完成了类似的多个requestPermissions()
调用,其形式是没有正确处理配置更改,并且两个版本的对话框都出现了。
在其他条件相同的情况下,您最好只是请求requestPermissions()
中的所有权限,因此只有一个对话框。这样可以更好地满足用户的期望,我认为这会简化您的代码。