权限流程图:
第一次弹出 选择拒绝-》弹出提醒对话框改权限功能-》 确定拒绝是 关闭当前页面
-》 确定拒绝否 --》继续申请该权限
第二次弹出 选择绝对不允许-》 弹出设置告诉用户需要在设置中打开权限-》 点击确定跳入设置中
第三次: 弹出跳入设置对话框,用户手动在设置中打开
compile 'com.yanzhenjie:permission:1.0.5'
========================================================================
package com.denganzhi.permission;
import com.yanzhenjie.permission.AndPermission;
import com.yanzhenjie.permission.PermissionNo;
import com.yanzhenjie.permission.PermissionYes;
public class PermissionActivity extends AppCompatActivity {
ImageView permission_bitmap;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_permission);
permission_bitmap = (ImageView)findViewById(R.id.permission_bitmap);
// 开始
sendPermeission();
}
// 权限测试使用
private String iMei="";
public void readImg(View view){
if (ActivityCompat.checkSelfPermission(PermissionActivity.this, Manifest.permission.READ_PHONE_STATE) != PackageManager.PERMISSION_GRANTED) {
//没有权限
Toast.makeText(PermissionActivity.this,"imei:没有权限",Toast.LENGTH_SHORT).show();
}else {
//有权限
iMei = ((TelephonyManager) getSystemService(TELEPHONY_SERVICE)).getDeviceId();
Toast.makeText(PermissionActivity.this,"imei:"+iMei,Toast.LENGTH_SHORT).show();
}
}
// 1.第一次弹出
private void sendPermeission(){
AndPermission.with(this).requestCode(100).permission(Manifest.permission.WRITE_EXTERNAL_STORAGE) .send();
}
// 2.第一次弹出选择允许,继续申请其他权限
// 成功回调的方法,用注解即可,里面的数字是请求时的requestCode。
@PermissionYes(100)
private void getLocationYes(List
// TODO 申请权限成功。
AndPermission.with(this).requestCode(101).permission(Manifest.permission.READ_PHONE_STATE) .send();
}
// 申请第二个权限
@PermissionYes(101)
private void gePhoneStatYes(List
// TODO 申请权限成功。
Toast.makeText(PermissionActivity.this,"读取手机卡状态!!!",Toast.LENGTH_SHORT).show();
// AndPermission.with(this).requestCode(102).permission(Manifest.permission.WRITE_EXTERNAL_STORAGE).send();
} // 成功回调的方法,用注解即可,里面的数字是请求时的requestCode。
// 第一个权限申请选择拒绝,或者第二次弹出选择永久拒绝处理
// 失败回调的方法,用注解即可,里面的数字是请求时的requestCode。
@PermissionNo(100)
private void getLocationNo(List
// 用户否勾选了不再提示并且拒绝了权限,那么提示用户到设置中授权。
Log.e("getLocationNo: ","1111" );
// 第二次 用户否勾选复选框了不再提示并且永久拒绝了权限,那么弹出对话框提示用户到设置中授权,用户点击确定跳入设置中
if (AndPermission.hasAlwaysDeniedPermission(this, deniedPermissions)) {
// 第一种:用默认的提示语。如果用户选择了绝对不允许,那么对话框不会弹出来了,只能拿到设置中打开
AndPermission.defaultSettingDialog(this, 100).show();
}else {
// finish();
// 3.第一次 弹出权限,用户选择拒绝, 弹出权限解释对话框
sendAgain(100,Manifest.permission.WRITE_EXTERNAL_STORAGE);
}
} // 失败回调的方法,用注解即可,里面的数字是请求时的requestCode。
// 第二次选择拒绝
@PermissionNo(101)
private void getPhoneStateNo(List
// 用户否勾选了不再提示并且拒绝了权限,那么弹出只能到设置中打开权限对话框,用户点击,跳入设置中
if (AndPermission.hasAlwaysDeniedPermission(this, deniedPermissions)) {
// 第一种:用默认的提示语。
AndPermission.defaultSettingDialog(this, 101).show();
}else {
// finish();
sendAgain(101,Manifest.permission.READ_PHONE_STATE);
}
} // 失败回调的方法,用注解即可,里面的数字是请求时的requestCode。
@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
// 只需要调用这一句,第一个参数是当前Acitivity/Fragment,回调方法写在当前Activity/Framgent。
AndPermission.onRequestPermissionsResult(this, requestCode, permissions, grantResults);
}
// 4. 权限解释对话框,如果用户选择 确定,那么继续申请当前权限
// 用户选择否,不申请,失败对话框
private void sendAgain(final int code,final String permission){
AlertDialog.build(PermissionActivity.this)
.setCancelable(false)
.setTitle("友好提醒")
.setMessage("您拒绝该该权限可能会导致应用无法正常使用,您确定要拒绝么?")
.setPositiveButton("否",new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
AndPermission.with(PermissionActivity.this).requestCode(code).permission(permission) .send();
}
})
.setNegativeButton("是", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
PermissionActivity.this.finish();
}
}).show();
}
}
========================================================================