您的位置:首页 > 移动开发 > Android开发

android6.0 权限管理 方案

2016-05-31 00:00 686 查看
摘要: android 6.0 权限管理

能找到这篇文章,说明你对android6.0权限已有所了解。介绍权限的文章满天飞,我就不介绍了。这里主要介绍2个问题。弹窗流程和微信的一样,大家打开微信可以试试。
1、如何知道已经获得权限?
2、系统第二次弹出权限询问对话框,用户勾选不再提示的复选框后,如果引导用户赋予应用权限?

这里使用到的开源库是

compile 'com.anthonycr.grant:permissions:1.0'

请自行加入到gradle里

0、先写个获得权限的回调方法,用户允许或者拒绝都会调用该方法

注意,该回调必须要加,否则开源库的onGranted()和onDenied(String permission)将不会调用

//是否显示自己定义的dialog,系统权限dialog弹出后用户勾选不在提示,该参数将起作用
protected boolean isShowMyPermissionsDialog = false;

@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions,
@NonNull int[] grantResults) {
if (grantResults.length > 0){
if(grantResults[0] == PackageManager.PERMISSION_GRANTED) {
//Do the stuff that requires permission...
isShowMyPermissionsDialog=false;
}else if (grantResults[0] == PackageManager.PERMISSION_DENIED){
// Should we show an explanation?
isShowMyPermissionsDialog=true;
}
}
//notify
PermissionsManager.getInstance().notifyPermissionsChange(permissions,grantResults);
}

1、 开始检查是否有权限

private void checkSdcardPermission() {
//检查你是否有READ_PHONE_STATE权限
if (!PermissionsManager.getInstance().hasPermission(this, Manifest.permission.READ_PHONE_STATE)) {
//shouldShowRequestPermissionRationale()默认为false
//第一次请求权限时,用户拒绝了,下一次:shouldShowRequestPermissionRationale()返回 true
//第二次请求权限时,用户拒绝了,并选择了“不在提醒”的选项时:shouldShowRequestPermissionRationale()返回 false
if (ActivityCompat.shouldShowRequestPermissionRationale(SplashActivity.this, Manifest.permission.READ_PHONE_STATE) && isShowMyPermissionsDialog) {
//显示自定义对话框,说明为啥需要这个权限
showMyPermissionsDialog();
} else {
//显示系统自带的权限询问对话框
showSystemPermissionsDialog();
}
return;
}
//已获得权限,读取想要的信息
......
startActivity();

}

2. 自定义权限询问对话框

private void showMyPermissionsDialog() {
showMessageOKCancel("在设置-应用-xx-权限中开启xxx权限,以正常使用xx功能",
new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
switch (which) {
case DialogInterface.BUTTON_POSITIVE:
//跳转设置页
goToAppSettings();
break;
case DialogInterface.BUTTON_NEGATIVE:
//取消
finish();
break;
}

}
});
}


3. 系统自动权限对话框

private void showSystemPermissionsDialog() {
PermissionsManager.getInstance().requestPermissionsIfNecessaryForResult(SplashActivity.this,
new String[]{Manifest.permission.READ_PHONE_STATE}, new PermissionsResultAction() {
@Override
public void onGranted() {
MLog.d("已获得READ_PHONE_STATE权限");
//已获得权限,读取想要的信息
......
}

@Override
public void onDenied(String permission) {
MLog.d("没有获得READ_PHONE_STATE权限");
showMyPermissionsDialog();
}
});
}

4. 跳转至应用设置页

private static final int REQUEST_APP_SETTINGS = 1;
/**
* 应用设置页
*/
private void goToAppSettings() {
Intent myAppSettings = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS, Uri.parse("package:" + getPackageName()));
myAppSettings.addCategory(Intent.CATEGORY_DEFAULT);
//        myAppSettings.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivityForResult(myAppSettings, REQUEST_APP_SETTINGS);
}


5. 用户在应用设置页设置完权限后回到应用,判断是否已获得权限

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == REQUEST_APP_SETTINGS) {

if (PermissionsManager.getInstance().hasPermission(this, Manifest.permission.READ_PHONE_STATE)) {
Toast.makeText(this, "READ_PHONE_STATE permissions granted!", Toast.LENGTH_SHORT).show();
//已获得权限,读取想要的信息
......
startActivity();
}
}
super.onActivityResult(requestCode, resultCode, data);
}

private void showMessageOKCancel(String message, DialogInterface.OnClickListener listener) {
new AlertDialog.Builder(SplashActivity.this)
.setMessage(message)
.setPositiveButton("OK", listener)
.setNegativeButton("Cancel", listener)
.create()
.show();
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息