在用户响应之前对自定义内核调用 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()
中的所有权限,因此只有一个对话框。这将更好地满足用户的期望,我认为它会稍微简化您的代码。
我有一个项目在启动时要求 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()
中的所有权限,因此只有一个对话框。这将更好地满足用户的期望,我认为它会稍微简化您的代码。