android 权限申请–在activity之外申请权限
1、android 权限申请工具类库
在申请权限时,最不爽的是权限申请结果的回调在activity中,如果在其他地方需要使用危险权限时非常不方便。为了解决这个问题,本类库中在申请权限时,会启动一个透明的activity—PermissionActivity,系统的回调在PermissionActivity中处理,然后在回调给使用的地方,并销毁 PermissionActivity。
特点:
- 可以在任意地方发起权限申请;
- 可以统一处理权限回调;
- 新增维护一个请求队列,依次处理请求,在连续多次发起请求时,不会造成回调冲突。
- 已经拥有申请的全部权限或api版本小于23,都会返回申请成功。
2、效果
申请时拒绝,拒绝后会回调被拒绝的权限,可以对被拒绝的权限进行说明,并重新申请。
申请时权限被拒绝,并勾选了不再询问,会回调被禁止的权限,可以请求用户去设置里面打开。
3、使用方式一:单独处理失败回调
注册权限
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.CAMERA"/>
<uses-permission android:name="android.permission.READ_PHONE_STATE"/>
<uses-permission android:name="android.permission.RECORD_AUDIO"/>
要申请的权限
final String[] permission= new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE,
Manifest.permission.CAMERA,
Manifest.permission.READ_PHONE_STATE};
要申请权限的回调
PermissionCallback callback=new PermissionCallback() {
@Override
public void onPermissionGranted() {
toast("权限申请成功--方式1");
}
@Override
public void shouldShowRational(final RequestBean requestBean,String[] rationalPermissons,
final boolean before) {
StringBuilder sb=new StringBuilder();
sb.append("我们将获取以下权限:\n\n");
for(int i=0;i<rationalPermissons.length;i++){
sb.append((i+1)+"、");
if(Manifest.permission.WRITE_EXTERNAL_STORAGE.equals(rationalPermissons[i])){
sb.append("读写设备外部存储空间的权限,将被用于获取用户头像、保存一些文件到项目文件夹中");
}else if(Manifest.permission.CAMERA.equals(rationalPermissons[i])){
sb.append("使用摄像头的权限将,被用于拍照获取用户头像,直播视频采集");
}else if(Manifest.permission.READ_PHONE_STATE.equals(rationalPermissons[i])){
sb.append("读取手机状态信息的权限,将被用于登录时账号验证");
}else if(Manifest.permission.RECORD_AUDIO.equals(rationalPermissons[i])){
sb.append("录制引起的权限,将被用于直播音频采集");
}
if(i==rationalPermissons.length-1){
sb.append("。");
}else{
sb.append(";");
}
sb.append("\n");
}
PermissionUtil.showDialog(MainActivity.this, sb.toString(),
new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
//重新申请权限
PermissionUtil.requestAgain(MainActivity.this,requestBean);
}
});
}
@Override
public void onPermissonReject(String[] rejectPermissons) {
StringBuilder sb=new StringBuilder();
sb.append("我们需要的权限:\n\n");
for(int i=0;i<rejectPermissons.length;i++){
sb.append((i+1)+"、");
if(Manifest.permission.WRITE_EXTERNAL_STORAGE.equals(rejectPermissons[i])){
sb.append("读写外部存储空间的权限,将被用于获取用户头像、保存一些文件到项目文件夹中");
}else if(Manifest.permission.CAMERA.equals(rejectPermissons[i])){
sb.append("使用摄像头的权限,被用于拍照获取用户头像,直播视频采集");
}else if(Manifest.permission.READ_PHONE_STATE.equals(rejectPermissons[i])){
sb.append("读取手机状态信息的权限,将被用于登录时账号验证");
}else if(Manifest.permission.RECORD_AUDIO.equals(rejectPermissons[i])){
sb.append("录制引起的权限,将被用于直播音频采集");
}
if(i==rejectPermissons.length-1){
sb.append("。");
}else{
sb.append(";");
}
sb.append("\n");
}
sb.append("\n被设为禁止,请到设置里开启权限");
PermissionUtil.showDialog(MainActivity.this, sb.toString(),
getString(R.string.dialog_cancel),
getString(R.string.dialog_go_setting),
new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
//重新申请权限
PermissionUtil.startSettingsActivity(MainActivity.this);
}
}
);
}
};
发起权限申请
PermissionUtil.request(MainActivity.this,permission,callback);
4、使用方式二:统一处理失败回调
在权限申请前设置统一回调,比如application里面
/** 申请失败的回调,整个app只需设置一次,统一在一个地方处理 */
PermissionUtil.setFailedCallBack(new FailedCallBack() {
@Override
public void shouldShowRational(final RequestBean requestBean,String[] rationalPermissons,
boolean before) {
StringBuilder sb=new StringBuilder();
sb.append("我们需要获取以下权限:\n\n");
for(int i=0;i<rationalPermissons.length;i++){
sb.append((i+1)+"、");
if(Manifest.permission.WRITE_EXTERNAL_STORAGE.equals(rationalPermissons[i])){
sb.append("读写设备外部存储空间的权限,将被用于获取用户头像、保存一些文件到项目文件夹中");
}else if(Manifest.permission.CAMERA.equals(rationalPermissons[i])){
sb.append("使用摄像头的权限,将被用于拍照获取用户头像,直播视频采集");
}else if(Manifest.permission.READ_PHONE_STATE.equals(rationalPermissons[i])){
sb.append("读取手机状态信息的权限,将被用于登录时账号验证");
}else if(Manifest.permission.RECORD_AUDIO.equals(rationalPermissons[i])){
sb.append("录制引起的权限,将被用于直播音频采集");
}
if(i==rationalPermissons.length-1){
sb.append("。");
}else{
sb.append(";");
}
sb.append("\n");
}
//弹出提示dialog
PermissionUtil.showDialog(MainActivity.this, sb.toString(),
new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
//重新申请权限
PermissionUtil.requestAgain(MainActivity.this,requestBean);
}
});
}
@Override
public void onPermissonReject(String[] rejectPermissons) {
StringBuilder sb=new StringBuilder();
sb.append("我们需要的权限:\n\n");
for(int i=0;i<rejectPermissons.length;i++){
sb.append((i+1)+"、");
if(Manifest.permission.WRITE_EXTERNAL_STORAGE.equals(rejectPermissons[i])){
sb.append("读写外部存储空间的权限,将被用于获取用户头像、保存一些文件到项目文件夹中");
}else if(Manifest.permission.CAMERA.equals(rejectPermissons[i])){
sb.append("使用摄像头的权限,被用于拍照获取用户头像,直播视频采集");
}else if(Manifest.permission.READ_PHONE_STATE.equals(rejectPermissons[i])){
sb.append("读取手机状态信息的权限,将被用于登录时账号验证");
}else if(Manifest.permission.RECORD_AUDIO.equals(rejectPermissons[i])){
sb.append("录制引起的权限,将被用于直播音频采集");
}
if(i==rejectPermissons.length-1){
sb.append("。");
}else{
sb.append(";");
}
sb.append("\n");
}
sb.append("\n被设为禁止,请到设置里开启权限");
//弹出提示dialog
PermissionUtil.showDialog(MainActivity.this, sb.toString(),
getString(R.string.dialog_cancel),
getString(R.string.dialog_go_setting),
new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
//重新申请权限
PermissionUtil.startSettingsActivity(MainActivity.this);
}
}
);
}
});
权限申请时设置成功的回调
/** 申请结果处理方式二 */
findViewById(R.id.text_view02).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//申请权限
PermissionUtil.request(MainActivity.this, permission, new SuccessCallback(){
@Override
public void onPermissionGranted() {
toast("权限申请成功--方式2");
}
});
}
5、源码
github
喜欢的小伙伴点下star 哈哈。
github慢也可以下载压缩包