棉花糖的运行时许可 [英] Run-time permission of Marshmallow
问题描述
运行时权限
我试图理解它并为此做一个演示,但是我想到一个问题,当我使用DIALOG处理用户权限时.
I am trying to understand it and make one demo for that But one question raise in my mind that when i am at handle user permission with DIALOG.
如何处理"不再询问"
假设我的应用程序必须需要位置/联系人,但用户使用永不询问"来拒绝它.
Suppose my application MUST need Location/contact but user DENY it with "NEVER ASK AGAIN".
我该怎么办.并非所有用户都了解我的字段是必填项.
What can i do for that. Not all User understand my field is required.
有任何建议吗?
推荐答案
首先,您需要在Activity
中实现ActivityCompat
类的OnRequestPermissionsResultCallback
Listener
,并覆盖void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults)
方法,以检查用户是否允许或拒绝许可
First you need to implement OnRequestPermissionsResultCallback
Listener
of ActivityCompat
class in your Activity
and override void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults)
Method to check whether User is allowing or denying the permission
您可以这样做.在这里,我检查WRITE_EXTERNAL_STORAGE
的权限访问权限:
You can do like this. Here i check for permission access for WRITE_EXTERNAL_STORAGE
:
int REQUEST_STORAGE = 1;
private void checkPermissions() {
if (hasStoragePermissionGranted()) {
// you can do whatever you want
} else {
requestPermission();
}
}
public boolean hasPermissionGranted(){
return ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED;
}
public void requestPermission() {
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.M){
ActivityCompat.requestPermissions(MainActivity.this, {Manifest.permission.WRITE_EXTERNAL_STORAGE},
REQUEST_STORAGE);
}
}
在此处,当用户从运行时权限"对话框中允许或拒绝权限时,将调用onRequestPermissionsResult()
方法.
Here is onRequestPermissionsResult()
method will be called when user allow or deny Permission from Runtime permission dialog.
您还可以处理用户已选中从不显示运行时权限"对话框的情况,可以显示Snackbar或按钮将用户重定向到您的应用程序设置页面,因为在用户选中"Never ask again"
后无法显示权限对话框.>
You can also handle situation when User has checked never show Runtime Permission dialog for that you can show Snackbar or button to redirect user to your application settings page as you can not show permission dialog after user has checked "Never ask again"
.
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions,
@NonNull int[] grantResults) {
if (requestCode == REQUEST_STORAGE) {
if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
//Storage permission is enabled
canSendAttachments = true;
systemLogsCheckbox.setEnabled(true);
} else if (ActivityCompat.shouldShowRequestPermissionRationale(MainActivtity.this, Manifest.permission.WRITE_EXTERNAL_STORAGE)) {
//User has deny from permission dialog
Snackbar.make(mainLayout, getResources().getString("Please enable storage permission"),
Snackbar.LENGTH_INDEFINITE)
.setAction("OK", new View.OnClickListener() {
@Override
public void onClick(View view) {
ActivityCompat.requestPermissions(MainActivity.this, {Manifest.permission.WRITE_EXTERNAL_STORAGE},
REQUEST_STORAGE);
}
})
.show();
} else {
// User has deny permission and checked never show permission dialog so you can redirect to Application settings page
Snackbar.make(mainLayout, getResources().getString("Please enable permission from settings"),
Snackbar.LENGTH_INDEFINITE)
.setAction("OK", new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent intent = new Intent();
intent.setAction(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
Uri uri = Uri.fromParts("package", MainActivity.this.getPackageName(), null);
intent.setData(uri);
startActivity(intent);
}
})
.show();
}
}
}
在这里,我已经使用Snackbar
向用户显示有关权限的相关消息,并且mainLayout
是Activity's Main Layout
的ID.
Here i have used Snackbar
to show relevant message to user about Permission and mainLayout
is id of Activity's Main Layout
.
希望它对您有帮助.
这篇关于棉花糖的运行时许可的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!