基于PermissionsDispatcher的动态权限demo,PermissionsDispatcher地址https://github.com/hotchemi/PermissionsDispatcher
(部分定制rom弹出请求权限提示框时体验有些许不同,例如华为emui)
dependencies {
compile('com.github.hotchemi:permissionsdispatcher:${latest.version}') {
// if you don't use android.app.Fragment you can exclude support for them
exclude module: "support-v13"
}
annotationProcessor 'com.github.hotchemi:permissionsdispatcher-processor:${latest.version}'
}
注解列表(总共也只有这几个注解):
Tip:注解的方法不能为 private
注解 | 必须 | 说明 |
---|---|---|
@RuntimePermissions | √ | 注册,表示在Activity或Fragment中处理动态权限 |
@NeedsPermission | √ | 注释一个执行时需要一个或多个权限的方法 |
@OnShowRationale | 注释一个说明方法,该方法说明为什么需要权限,该方法通过一个 PermissionRequest 对象可以终止或继续此权限请求 | |
@OnPermissionDenied | 当用户拒绝权限时调用此注解注释的方法 | |
@OnNeverAskAgain | 当用户勾选了“不再询问”后又调用检测权限时调用此注解注释的方法 |
@RuntimePermissions
public class MainActivity extends AppCompatActivity {
@NeedsPermission(Manifest.permission.CAMERA)
void showCamera() {
getSupportFragmentManager().beginTransaction()
.replace(R.id.sample_content_fragment, CameraPreviewFragment.newInstance())
.addToBackStack("camera")
.commitAllowingStateLoss();
}
@OnShowRationale(Manifest.permission.CAMERA)
void showRationaleForCamera(final PermissionRequest request) {
new AlertDialog.Builder(this)
.setMessage(R.string.permission_camera_rationale)
.setPositiveButton(R.string.button_allow, (dialog, button) -> request.proceed())
.setNegativeButton(R.string.button_deny, (dialog, button) -> request.cancel())
.show();
}
@OnPermissionDenied(Manifest.permission.CAMERA)
void showDeniedForCamera() {
Toast.makeText(this, R.string.permission_camera_denied, Toast.LENGTH_SHORT).show();
}
@OnNeverAskAgain(Manifest.permission.CAMERA)
void showNeverAskForCamera() {
Toast.makeText(this, R.string.permission_camera_neverask, Toast.LENGTH_SHORT).show();
}
}
在编译时, PermissionsDispatcher会产生一个类 Mainactivitypermissionsdispatcher ([Activity Name] + permissionsdispatcher),你可以用它来安全地访问这些权限保护方法。酱紫:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
findViewById(R.id.button_camera).setOnClickListener(v -> {
// NOTE: delegate the permission handling to generated method
MainActivityPermissionsDispatcher.showCameraWithCheck(this);
});
findViewById(R.id.button_contacts).setOnClickListener(v -> {
// NOTE: delegate the permission handling to generated method
MainActivityPermissionsDispatcher.showContactsWithCheck(this);
});
}
@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);
}
你需要添加 AndroidAnnotationsPermissionsDispatcherPlugin 的依赖:
在项目project的 build.gradle 中添加
allprojects {
repositories {
...
maven { url "https://jitpack.io" }
}
}
在项目moudle的 build.gradle 中添加
dependencies {
//PermissionsDispatcher has to be above AndroidAnnotations
compile 'com.github.hotchemi:permissionsdispatcher:2.1.3'
apt 'com.github.hotchemi:permissionsdispatcher-processor:2.1.3'
compile 'org.androidannotations:androidannotations-api:4.0.0'
apt 'org.androidannotations:androidannotations:4.0.0'
apt 'com.github.AleksanderMielczarek:AndroidAnnotationsPermissionsDispatcherPlugin:0.1.0'
}
更多详情:https://github.com/hotchemi/PermissionsDispatcher
危险权限和权限组
如果设备运行的是 Android 6.0(API 级别 23)或更高版本,并且应用的 targetSdkVersion 是 23 或更高版本,则应用在运行时需要向用户请求权限(危险权限,即可能影响用户隐私或设备正常操作的权限)。用户授权同一危险权限组内的权限,系统会自动授权该权限组内的其他权限。
权限组 | 权限 | 描述 |
---|---|---|
CALENDAR(日历) | READ_CALENDAR(读取日程提醒) | 允许程序读取用户的日程信息 |
WRITE_CALENDAR(写入日程提醒) | 写入日程,但不可读取 | |
CAMERA(相机) | CAMERA(拍照权限) | 允许访问摄像头进行拍照 |
CONTACTS(联系人) | READ_CONTACTS(读取联系人) | 允许应用访问联系人通讯录信息 |
WRITE_CONTACTS(写入联系人) | 写入联系人,但不可读取 | |
GET_ACCOUNTS(访问账户Gmail列表) | 访问GMail账户列表 | |
LOCATION(定位) | ACCESS_FINE_LOCATION(获取精确位置) | 通过GPS芯片接收卫星的定位信息,定位精度达10米以内 |
ACCESS_COARSE_LOCATION(获取错略位置) | 通过WiFi或移动基站的方式获取用户错略的经纬度信息,定位精度大概误差在30~1500米 | |
MICROPHONE(麦克风) | RECORD_AUDIO(录音) | 通过手机或耳机的麦克风录制声音 |
PHONE(手机) | READ_PHONE_STATE(读取电话状态) | 访问电话状态 |
CALL_PHONE(拨打电话) | 允许程序从非系统拨号器里输入电话号码 | |
READ_CALL_LOG(读取拨号日志) | 允许应用程序读取用户的拨号日志 | |
WRITE_CALL_LOG(写入拨号日志) | 允许应用程序写入用户的拨号日志 | |
ADD_VOICEMAIL(添加语音信箱) | 允许应用程序添加系统语音邮件 | |
USE_SIP(使用SIP视频) | 允许程序使用SIP视频服务 | |
PROCESS_OUTGOING_CALLS(处理拨出电话) | 允许程序监视,修改或放弃播出电话 | |
SENSORS(传感器) | BODY_SENSORS(体传感器) | 允许应用程序访问用户使用的传感器的数据来测量他/她的身体内发生的事情,如心率 |
SMS(短信) | SEND_SMS(发送短信) | 发送短信 |
RECEIVE_SMS(接收短信) | 接收短信 | |
READ_SMS(读取短信内容) | 读取短信内容 | |
RECEIVE_WAP_PUSH(接收Wap Push) | 接收WAP PUSH信息 | |
RECEIVE_MMS(接收彩信) | 接收彩信 | |
STORAGE(存储) | READ_EXTERNAL_STORAGE(读取外部存储) | 允许应用程序从外部存储读取 |
WRITE_EXTERNAL_STORAGE(写入外部存储) | 允许应用程序写入外部存储 |
更多详情:https://developer.android.com/guide/topics/security/permissions.html?hl=zh-cn#defining