我浏览了所有答案,但不满足我确切需要的答案,所以这是一个我编写的并且完美运行的示例,即使用户点击了不再询问复选框。
-
创建一个方法,当你想请求运行时权限时会调用它,比如readContacts(),或者你也可以拥有openCamera(),如下所示:
private void readContacts() {
if (!askContactsPermission()) {
return;
} else {
queryContacts();
} }
现在我们需要创建askContactsPermission(),您也可以将其命名为askCameraPermission() 或您要请求的任何权限。
private boolean askContactsPermission() {
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) {
return true;
}
if (checkSelfPermission(READ_CONTACTS) == PackageManager.PERMISSION_GRANTED) {
return true;
}
if (shouldShowRequestPermissionRationale(READ_CONTACTS)) {
Snackbar.make(parentLayout, R.string.permission_rationale, Snackbar.LENGTH_INDEFINITE)
.setAction(android.R.string.ok, new View.OnClickListener() {
@Override
@TargetApi(Build.VERSION_CODES.M)
public void onClick(View v) {
requestPermissions(new String[]{READ_CONTACTS}, REQUEST_READ_CONTACTS);
}
}).show();
} else if (contactPermissionNotGiven) {
openPermissionSettingDialog();
} else {
requestPermissions(new String[]{READ_CONTACTS}, REQUEST_READ_CONTACTS);
contactPermissionNotGiven = true;
}
return false;
}
在编写此函数之前,请确保您已定义如下实例变量,如下所示:
private View parentLayout;
private boolean contactPermissionNotGiven;;
/**
* Id to identity READ_CONTACTS permission request.
*/
private static final int REQUEST_READ_CONTACTS = 0;
现在是覆盖onRequestPermissionsResult 方法的最后一步,如下所示:
/**
* Callback received when a permissions request has been completed.
*/
@RequiresApi(api = Build.VERSION_CODES.M)
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions,
@NonNull int[] grantResults) {
if (requestCode == REQUEST_READ_CONTACTS) {
if (grantResults.length == 1 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
queryContacts();
}
}
}
这里我们完成了运行时权限,插件是openPermissionSettingDialog(),如果用户通过单击不再询问复选框永久禁用权限,它只需打开设置屏幕。下面是方法:
private void openPermissionSettingDialog() {
String message = getString(R.string.message_permission_disabled);
AlertDialog alertDialog =
new AlertDialog.Builder(MainActivity.this, AlertDialog.THEME_DEVICE_DEFAULT_LIGHT)
.setMessage(message)
.setPositiveButton(getString(android.R.string.ok),
new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
Intent intent = new Intent();
intent.setAction(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
Uri uri = Uri.fromParts("package", getPackageName(), null);
intent.setData(uri);
startActivity(intent);
dialog.cancel();
}
}).show();
alertDialog.setCanceledOnTouchOutside(true);
}
我们错过了什么?
1.在strings.xml中定义使用的字符串
<string name="permission_rationale">"Contacts permissions are needed to display Contacts."</string>
<string name="message_permission_disabled">You have disabled the permissions permanently,
To enable the permissions please go to Settings -> Permissions and enable the required Permissions,
pressing OK you will be navigated to Settings screen</string>
-
在onCreate方法中初始化parentLayout变量
parentLayout = findViewById(R.id.content);
在AndroidManifest.xml中定义所需的权限
<uses-permission android:name="android.permission.READ_CONTACTS" />
-
queryContacts 方法,根据您的需要或运行时权限,您可以调用需要permission 的方法。就我而言,我只是使用加载器来获取联系人,如下所示:
private void queryContacts() {
getLoaderManager().initLoader(0, null, this);}
这工作非常愉快的编码:)