Android手机权限申请,对权限进行封装管理,方便使用时申请权限回调。不只是Android6.0+,国产机在Android6.0之前的版本也有权限的操作,借助permissions4m的思路,对国产机强制申请。
compile 'com.excellence:permission:_latestVersion'
Android申请权限,用户点击来确定是否授权,分三种情况:授权、拒绝、拒绝-不再提示。前两种比较好理解,第三种“拒绝-不再提示”,即用户选择了“不再提示”,则再次使用动态权限申请,不弹出授权框,用户无法授权,这种情况在授权失败处,检测是否“不再提示”,选中“不再提示”后下次申请,系统权限申请框没反应,只能自定义弹框:提示用户进入Setting,让用户进入Setting的apk中授权。
/**
* 申请单个权限
*/
private void singleRequest()
{
PermissionRequest.with(this).permission(WRITE_EXTERNAL_STORAGE).request(new IPermissionListener()
{
@Override
public void onPermissionsGranted()
{
Toast.makeText(MainActivity.this, "申请单个权限成功", Toast.LENGTH_SHORT).show();
}
@Override
public void onPermissionsDenied()
{
Toast.makeText(MainActivity.this, "申请单个权限失败", Toast.LENGTH_SHORT).show();
}
});
}
/**
* 申请多个权限
*/
private void multiRequest()
{
PermissionRequest.with(this).permission(READ_CONTACTS, CAMERA).request(new IPermissionListener()
{
@Override
public void onPermissionsGranted()
{
Toast.makeText(MainActivity.this, "申请多个权限成功", Toast.LENGTH_SHORT).show();
}
@Override
public void onPermissionsDenied()
{
Toast.makeText(MainActivity.this, "申请多个权限失败", Toast.LENGTH_SHORT).show();
}
});
}
注意
PermissionRequest
可以在任何地方执行request的权限申请SettingDialog
对Context判断- Context是Activity类型时,执行startActivityForResult,在当前Activity中接收权限申请结果
- Context是其他类型,则执行startActivity
- 原生的Android6.0权限与targetSDKVersion有关,targetSDKVersion < 23 ,使用
PermissionChecker.checkSelfPermission
判断权限;targetSDKVersion >= 23时使用ContextCompat.checkSelfPermission
判断权限。 - 有些国产机使用原生申请方法无效,因此强制申请:通过触发权限功能+
try catch
的方式,判断是否有权限,然后根据不同的机型跳转到对应的权限管理界面。 - 国产手机6.0以前可以手动关闭权限。
版本 | 描述 |
---|---|
1.0.2 | 兼容低版本机型 2019-03-28 |
1.0.1 | 增加国产机型权限检测、权限界面跳转 2018-01-03 |
1.0.0 | Android6.0原生动态申请权限 2017-10-21 |