android自从更新到6.0以后,经常需要权限申请,这给开发者带来了很大的麻烦,为了减轻大家的工作负担,今天介绍一个开元项目PermissionsDispatcher,PermissionsDispatcher是一个基于注解、帮助开发者简单处理Android 6.0系统中的运行时权限的开源库。避免了开发者编写大量繁琐的样板代码。
开源地址:https://github.com/hotchemi/PermissionsDispatcher
1. 添加依赖:
工程项目的:build.gradle
repositories { jcenter() maven { url 'http://oss.jfrog.org/artifactory/oss-snapshot-local/' } }
app模块的build.gradle
compile("com.github.hotchemi:permissionsdispatcher:3.1.0") { // if you don't use android.app.Fragment you can exclude support for them exclude module: "support-v13" } annotationProcessor "com.github.hotchemi:permissionsdispatcher-processor:3.1.0"
2、在Activity或Fragment中使用
注解列表:
Annotation | Required | Description |
---|---|---|
@RuntimePermissions | ✓ | 注解在其内部需要使用运行时权限的Activity或Fragment上 |
@NeedsPermission | ✓ | 注解在需要调用运行时权限的方法上,当用户给予权限时会执行该方法 |
@OnShowRationale | 注解在用于向用户解释为什么需要调用该权限的方法上,只有当第一次请求权限被用户拒绝,下次请求权限之前会调用 | |
@OnPermissionDenied | 注解在当用户拒绝了权限请求时需要调用的方法上 | |
@OnNeverAskAgain | 注解在当用户选中了授权窗口中的不再询问复选框后并拒绝了权限请求时需要调用的方法,一般可以向用户解释为何申请此权限,并根据实际需求决定是否再次弹出权限请求对话框 |
只有注意:被注解的方法不能是私有方法。
@RuntimePermissions
和
@NeedsPermission
是必须的,其余注解均为可选。当使用了
@RuntimePermissions
和
@NeedsPermission
之后,需要点击菜单栏中
Build
菜单下的
Make Project
,或者按快捷键
Ctrl + F9
编译整个项目,编译器会在
app\build\intermediates\classes\debug
目录下与被注解的Activity同一个包下生成一个辅助类,名称为
被注解的Activity名称+PermissionsDispatcher.class
接下来可以调用辅助类里面的方法完成应用的权限请求了。
在需要调用权限的位置调用辅助类里面的xxxWithCheck
方法,xxx
是被@NeedsPermission
注解的方法名。如:
MainActivityPermissionsDispatcher.showCameraWithCheck(this);
之后,还需要重写该Activity的onRequestPermissionsResult()
方法,其方法内调用辅助类的onRequestPermissionsResult()
方法,如下:
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
// NOTE: delegate the permission handling to generated method
MainActivityPermissionsDispatcher.onRequestPermissionsResult(this, requestCode, grantResults);
}
@RuntimePermissions public class ShareActivity extends AppCompatActivity { Button bt_share_qq; Button bt_share_wx; Button bt_share_wx_cicle; Button bt_share_qq_zone; Button bt_share_qq_text; // public static Tencent mTencent; ShareUtil shareUtil; private Context context; @Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.share_activity); shareUtil = new ShareUtil(); context = this; shareUtil.regToQQ(getApplicationContext()); // if (mTencent == null) { // mTencent = Tencent.createInstance("1106691701", this); // } bt_share_qq = findViewById(R.id.bt_share_qq); bt_share_qq_text = findViewById(R.id.bt_share_qq_text); bt_share_wx = findViewById(R.id.bt_share_wx); bt_share_wx_cicle = findViewById(R.id.bt_share_wx_cicle); bt_share_qq_zone = findViewById(R.id.bt_share_qq_zone); bt_share_qq.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { ShareActivityPermissionsDispatcher.shareQQWithPermissionCheck(ShareActivity.this); } }); bt_share_wx.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { ShareActivityPermissionsDispatcher.shareWXWithPermissionCheck(ShareActivity.this); } }); bt_share_wx_cicle.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { ShareActivityPermissionsDispatcher.shareWXCicleWithPermissionCheck(ShareActivity.this); } }); bt_share_qq_zone.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { ShareActivityPermissionsDispatcher.shareQQZoneWithPermissionCheck(ShareActivity.this); } }); bt_share_qq_text.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { ShareActivityPermissionsDispatcher.shareQQTexyWithPermissionCheck(ShareActivity.this); } }); } @NeedsPermission({Manifest.permission.WRITE_EXTERNAL_STORAGE,Manifest.permission.MEDIA_CONTENT_CONTROL}) public void shareQQTexy(){ // QQ分享文字 AndroidShare androidShare = new AndroidShare(ShareActivity.this); // androidShare.shareQQFriend("百度浏览器","www.baidu.com",AndroidShare.TEXT,null); androidShare.shareQQ(context,"www.baidu.com"); } @NeedsPermission({Manifest.permission.WRITE_EXTERNAL_STORAGE,Manifest.permission.MEDIA_CONTENT_CONTROL}) public void shareQQ(){ // QQ分享图片 // XAndroidShare xAndroidShare = new XAndroidShare(ShareActivity.this); // xAndroidShare.shareQQFriend("百度浏览器","www.baidu.com",XAndroidShare.DRAWABLE, // getResources().getDrawable(R.mipmap.ic_launcher)); BitmapDrawable bd = (BitmapDrawable) getResources().getDrawable(R.mipmap.ic_launcher); Bitmap bt = bd.getBitmap(); AndroidShare androidShare = new AndroidShare(ShareActivity.this); androidShare.shareQQFriend("百度浏览器","www.baidu.com",AndroidShare.DRAWABLE, bt); } @NeedsPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE) public void shareWX(){ AndroidShare androidShare = new AndroidShare(ShareActivity.this); //微信分享 androidShare.shareWeChatFriend("百度浏览器","www.baidu.com",XAndroidShare.TEXT,null); } @NeedsPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE) public void shareWXCicle(){ AndroidShare AndroidShare = new AndroidShare(ShareActivity.this); BitmapDrawable bd = (BitmapDrawable) getResources().getDrawable(R.mipmap.ic_launcher); Bitmap bt = bd.getBitmap(); AndroidShare.shareWeChatFriendCircle("百度浏览器","www.baidu.com", bt); } @NeedsPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE) public void shareQQZone(){ AndroidShare xAndroidShare = new AndroidShare(ShareActivity.this); BitmapDrawable bd = (BitmapDrawable) getResources().getDrawable(R.mipmap.ic_launcher); Bitmap bt = bd.getBitmap(); xAndroidShare.shareQQZone("百度浏览器","www.baidu.com",AndroidShare.DRAWABLE ,bt); }
3、附:危险权限和权限组列表
Android官方文档:https://developer.android.com/guide/topics/security/permissions.html#normal-dangerous
摘录如下:
权限组 | 权限 |
---|---|
CALENDAR | READ_CALENDAR WRITE_CALENDAR |
CAMERA | CAMERA |
CONTACTS | READ_CONTACTS WRITE_CONTACTS GET_ACCOUNTS |
LOCATION | ACCESS_FINE_LOCATION ACCESS_COARSE_LOCATION |
PHONE | READ_PHONE_STATE CALL_PHONE READ_CALL_LOG WRITE_CALL_LOG ADD_VOICEMAIL USE_SIP PROCESS_OUTGOING_CALLS |
SENSORS | BODY_SENSORS |
SMS | SEND_SMS RECEIVE_SMS READ_SMS RECEIVE_WAP_PUSH RECEIVE_MMS |
STORAGE | READ_EXTERNAL_STORAGE WRITE_EXTERNAL_STORAGE |