Android知识Android开发Android技术知识

Android6.0权限适配

2016-09-28  本文已影响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
上一篇下一篇

猜你喜欢

热点阅读