版权声明:没有申明版权,你们随意! https://blog.csdn.net/baby986911/article/details/78849573
现在安卓6.0申请权限的开源代码也很多,但是不想项目里引用的东西太多,能不搬的就不搬了,自己写了一个申请权限的,在Gerymontion上测试,还能用,如果有需要改善的,请留言.
1 写一个接口
public interface PermissionListener { //有权限或者申请的时候给了,就继续做下面的动作 void hasPermission() ; //没有权限 void hasNoPermission() ; //点了不再提示 void neverShowPermission(); }
2 写一个申请的工具类
public enum PermissionUtil { INSTRANSE ; private PermissionListener permissionListener ; //请求权限 public void responsePermission(AppCompatActivity appCompatActivity ,PermissionListener permissionListener, String... permissionName) { this.permissionListener = permissionListener; if (Build.VERSION.SDK_INT >= 23) { List<String> pList = new ArrayList<>(); for (String str : permissionName) { pList.add(str); } String[] strings = pList.toArray(new String[pList.size()]); boolean bb = checkPermissionAllGranted(appCompatActivity, strings); if (!bb) { //如果没有,请求 ActivityCompat.requestPermissions(appCompatActivity, strings, Constants.permissionStr.permissionResponse); } else { //有权限 permissionListener.hasPermission(); } }else{ //小于23,没必要申请 permissionListener.hasPermission(); } } /** * 检查APP是否拥有指定的所有权限 */ protected boolean checkPermissionAllGranted(Context mContext, String[] permissions) { for (String permission : permissions) { if (ContextCompat.checkSelfPermission(mContext, permission) != PackageManager.PERMISSION_GRANTED) { // 只要有一个权限没有被授予, 则直接返回 false return false; } } return true; } public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults,AbstractActivity activity){ if (requestCode == Constants.permissionStr.permissionResponse) { if (PackageManager.PERMISSION_GRANTED == grantResults[0] ) { //给了权限可以直接去操作 permissionListener.hasPermission(); } else { if(neverShow(permissions, activity)){ permissionListener.neverShowPermission(); }else{ permissionListener.hasNoPermission(); } } } } //在用户已经拒绝授权的情况下,如果shouldShowRequestPermissionRationale返回false则 // 可以推断出用户选择了“不在提示”选项,在这种情况下需要引导用户至设置页手动授权 private boolean neverShow(String permissions[], AbstractActivity activity){ boolean showagain ; if (!ActivityCompat.shouldShowRequestPermissionRationale(activity, permissions[0])) { showagain = true ; }else{ showagain = false ; } return showagain ; } }3 假如用户点了不再提示,提示用户去设置(这个bug肯定是有的,自行解决,我们是特定的机型,所以不需要适配其他机型)
public enum DailogUtil { INSTRANS; public void getDailog(final AbstractActivity activity, final PermissionListener permissionListener) { new AlertDialog.Builder(activity) .setMessage("权限都不给我,你还想使用APP吗?去设置页面手动授权再来吧!!!!") .setPositiveButton("去授权", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { //引导用户至设置页手动授权 Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS); //Constants.packageName 项目的包名,你可以写死 Uri uri = Uri.fromParts("package", Constants.packageName, null); intent.setData(uri); activity.startActivity(intent); } }) .setNegativeButton("取消", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { //引导用户手动授权,权限请求失败 permissionListener.hasNoPermission(); } }).setOnCancelListener(new DialogInterface.OnCancelListener() { @Override public void onCancel(DialogInterface dialog) { //引导用户手动授权,权限请求失败 permissionListener.hasNoPermission(); } }).show(); } }4 在申请的Activity里面去申请
4.1 定义PermissionListener
PermissionListener permissionListener ;
4.2 初始化接口
permissionListener= new PermissionListener() { @Override public void hasPermission() { Log.e("MainActivity-->","申请成功"); // TODO: 2017/12/20 } @Override public void hasNoPermission() { Log.e("MainActivity-->","申请失败"); // TODO: 2017/12/20 } @Override public void neverShowPermission() { Log.e("MainActivity-->","点击了不再提示"); DailogUtil.INSTRANS.getDailog(MainActivity.this , permissionListener ); } };
5 点击调用
case R.id.requestpermission: /** * Manifest.permission.WRITE_EXTERNAL_STORAGE; * Manifest.permission.WRITE_SETTINGS; * 定义成常量了 */ PermissionUtil.INSTRANSE.responsePermission(this, permissionListener, new String[]{ Constants.permissionStr.WRITE_EXTERNAL_STORAGE,Constants.permissionStr.Setting }); break;
5 重写 onRequestPermissionsResult
@Override public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { PermissionUtil.INSTRANSE.onRequestPermissionsResult(requestCode,permissions,grantResults,this); }
6 打完收工