Android API 23之后以下权限需要动态获取:
DangerousPermissions****如下:
Paste_Image.png先偷一张图,原生的小栗子:
Paste_Image.png接下来是使用Permissiondispatcher第三方库来实现的方式:
- 在项目的build.gradle中(是下图第一个不是第二个)配置:
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 授权不再拒绝不再显示回调
使用方式:
- 先在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
网友评论