棉花糖权限对话框不提示



在棉花糖中,如果第一次权限被拒绝,运行时权限对话框不会再次启动。 我必须3个危险权限WRITE_EXTERNAL_STORAGE,READ_SMS和相机权限。 谁能告诉我哪里出错了。

if (Build.VERSION.SDK_INT >= 23) {
if (ContextCompat.checkSelfPermission(getActivity(),
Manifest.permission.WRITE_EXTERNAL_STORAGE)
!= PackageManager.PERMISSION_GRANTED || ContextCompat.checkSelfPermission(getActivity(),
Manifest.permission.CAMERA)
!= PackageManager.PERMISSION_GRANTED || ContextCompat.checkSelfPermission(getActivity(),
Manifest.permission.READ_SMS)
!= PackageManager.PERMISSION_GRANTED) {
if (ContextCompat.checkSelfPermission(getActivity(),
Manifest.permission.WRITE_EXTERNAL_STORAGE)
!= PackageManager.PERMISSION_GRANTED) {
if (ActivityCompat.shouldShowRequestPermissionRationale(getActivity(),
Manifest.permission.WRITE_EXTERNAL_STORAGE)) {
} else {   
ActivityCompat.requestPermissions(getActivity(),
new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},
MY_PERMISSIONS_REQUEST_WRITE_EXTERNAL_STORAGE);
}
}
if (ContextCompat.checkSelfPermission(getActivity(),
Manifest.permission.CAMERA)
!= PackageManager.PERMISSION_GRANTED) {
if (ActivityCompat.shouldShowRequestPermissionRationale(getActivity(),
Manifest.permission.WRITE_EXTERNAL_STORAGE)) {
} else {
ActivityCompat.requestPermissions(getActivity(),
new String[]{Manifest.permission.CAMERA},
MY_PERMISSIONS_REQUEST_CAMERA);
}
}
if (ContextCompat.checkSelfPermission(getActivity(),
Manifest.permission.READ_SMS)
!= PackageManager.PERMISSION_GRANTED) {
if (ActivityCompat.shouldShowRequestPermissionRationale(getActivity(),
Manifest.permission.WRITE_EXTERNAL_STORAGE)) {
} else {
ActivityCompat.requestPermissions(getActivity(),
new String[]{Manifest.permission.READ_SMS},
MY_PERMISSIONS_REQUEST_SMS);
}
}
}
}

我认为你必须使用

requestPermissions(new String[]{Manifest.permission.CAMERA}, Constants.RESULT_CODE);

而不是

ActivityCompat.requestPermissions(getActivity(),
new String[]{Manifest.permission.CAMERA},
MY_PERMISSIONS_REQUEST_CAMERA);

使用此代码可能会对您有所帮助

在要打开权限请求对话框的位置使用此代码。

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
requestPermissions(new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, 1);
requestPermissions(new String[]{Manifest.permission.CAMERA}, 2);
requestPermissions(new String[]{Manifest.permission.READ_SMS}, 3);

}

下面的代码用于处理权限对话框响应(再次打开权限对话框并授予或拒绝权限检查等)

@RequiresApi(api = Build.VERSION_CODES.M)
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
if (requestCode == 1) {
if (ActivityCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
if (shouldShowRequestPermissionRationale(Manifest.permission.WRITE_EXTERNAL_STORAGE)) {
requestPermissions(new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, 1);
}
else{
Log.e("permission force:", "Here you code if anyone check never and denied request of Write External Storage");
}
}
} else if (requestCode == 2) {
if (ActivityCompat.checkSelfPermission(this, Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) {
if (shouldShowRequestPermissionRationale(Manifest.permission.CAMERA)) {
requestPermissions(new String[]{Manifest.permission.CAMERA}, 2);
}else{
Log.e("permission force:", "Here you code if anyone check never and denied request of Camera");

}
}
}else if (requestCode == 3) {
if (ActivityCompat.checkSelfPermission(this, Manifest.permission.READ_SMS) != PackageManager.PERMISSION_GRANTED) {
if (shouldShowRequestPermissionRationale(Manifest.permission.READ_SMS)) {
requestPermissions(new String[]{Manifest.permission.READ_SMS}, 3);
}else{
Log.e("permission force:", "Here you code if anyone check never and denied request of ReadSMS");

}
}
}

}

运行时权限 API 的一个更令人困惑的方面是,shouldShowRequestPermissionRationale()仅在onRequestPermissionsResult()回调中PERMISSION_DENIED时使用。在其他地方这样做会导致奇怪的行为。

最好的办法是检查所需的权限并请求它(如果你的应用没有)。如果需要,在结果中处理拒绝。

您可能会发现此帮助程序库更容易处理,因为它会为您处理此问题,并且还可以帮助您的应用遵循 Google ui:https://github.com/hiqes/andele 准则

最新更新