Android6.0权限适配

作者: 十方天仪君 | 来源:发表于2016-09-28 10:53 被阅读635次

    Android API 23之后以下权限需要动态获取:

    DangerousPermissions****如下:

    Paste_Image.png

    先偷一张图,原生的小栗子:

    Paste_Image.png

    接下来是使用Permissiondispatcher第三方库来实现的方式:

    1. 在项目的build.gradle中(是下图第一个不是第二个)配置:
    Paste_Image.png
    buildscript {  
      dependencies {
        classpath 'com.neenbedankt.gradle.plugins:android-apt:1.8'
      }
    }
    

    2.在module中的build.gradle加上:

    apply plugin: 'android-apt'
    
    dependencies {  
      compile 'com.github.hotchemi:permissionsdispatcher:2.2.0'
      apt 'com.github.hotchemi:permissionsdispatcher-processor:2.2.0'
    }
    

    注解方法含义:
    @RuntimePermissions 标记需要运行时判断的类

    @NeedsPermission 标记需要检查权限的方法

    @OnShowRationale 授权提示回调

    @OnPermissionDenied 授权被拒绝回调

    @OnNeverAskAgain 授权不再拒绝不再显示回调

    使用方式:

    1. 先在Manifest里添加相应权限:
      <uses-permission android:name="android.permission.READ_PHONE_STATE" />

    2.相应的类

    @RuntimePermissions
    public class MainActivity extends AppCompatActivity implements View.OnClickListener {
       @Override
       protected void onCreate(Bundle savedInstanceState) {
           super.onCreate(savedInstanceState);
           setContentView(R.layout.activity_main);
    
           findViewById(R.id.btn).setOnClickListener(this);
    
       }
    
       @Override
       public void onClick(View view) {
           switch (view.getId()) {
               case R.id.btn:
                   MainActivityPermissionsDispatcher.getPhoneSignWithCheck(this);
                   break;
           }
       }
    
       /**
        * 运行时候需要的权限
        **/
       @NeedsPermission(Manifest.permission.READ_PHONE_STATE)
       void getPhoneSign() {
           TelephonyManager TelephonyMgr = (TelephonyManager) getSystemService(TELEPHONY_SERVICE);
           if (TelephonyMgr != null) {
           String szImei = TelephonyMgr.getDeviceId();   // Requires READ_PHONE_STATE
               Toast.makeText(this, "sign--->" + szImei, Toast.LENGTH_SHORT).show();
           }
       }
    
       @OnShowRationale(Manifest.permission.READ_PHONE_STATE)
       void showRationale(PermissionRequest request) {
           request.proceed();//提示用户权限使用的对话框
    
       }
    
       /**
        * 用户永久拒绝权限使用
        **/
       @OnNeverAskAgain(Manifest.permission.READ_PHONE_STATE)
       void OnNeverAskAgin() {
           Toast.makeText(this, "你永久拒绝了该权限", Toast.LENGTH_SHORT).show();
       }
    
       /**
        * 用户拒绝该权限执行方法
        **/
       @OnPermissionDenied(Manifest.permission.READ_PHONE_STATE)
       void statePermissionDenied() {
           Toast.makeText(this, "你拒绝了该权限", Toast.LENGTH_SHORT).show();
       }
    
       /**
        * 权限回调方法,用户点击允许或者拒绝之后都会调用此方法
        * requestCode 定义的权限编码--->请求码
        * permisssions 权限名称
        * grantResults 允许/拒绝
        **/
       @Override
       public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
           super.onRequestPermissionsResult(requestCode, permissions, grantResults);
           MainActivityPermissionsDispatcher.onRequestPermissionsResult(this, requestCode, grantResults);
       }
    
    }
    

    3.首先@RuntimePermissions注解需要进行权限判断的类

    4.将需要权限的操作定义在一个方法里,并用 @NeedsPermission(Manifest.permission.READ_PHONE_STATE)表明需要的权限(可以是多个)

    5.编译一下,就会生成【当前类名+PermissionsDispatcher】的类,在原本调用的地方调用@NeedsPermission标记的方法,这时候你会发现会对应生成【方法名+WithCheck】的方法

    6.如果你需要监听拒绝后的操作,则使用@OnPermissionDenied,使用方法一样。
    在我没得工作中可以将此类封装到BaseActivity里,然后子类调用。
    放上此类github地址:[1]:https://github.com/hotchemi/PermissionsDispatcher

    Paste_Image.png

    相关文章

      网友评论

        本文标题:Android6.0权限适配

        本文链接:https://www.haomeiwen.com/subject/kqacyttx.html