怎么说呢,请求权限本来很简单的一件事情,通过就算,不通过就提示,还没申请就申请,网上的教程搞得这么复杂,连RxPermision都他么出来了,查了半天还他么用不了,干脆就用土办法了,最后发现,土办法还更简单明了一些……
权限请求需要有onRequestPermissionsResult回调操作,所以大家一眼看上去都觉得好复杂,实际上在BaseActivity上面做处理,提供方法给子Activity处理就可以了。本代码的逻辑是在BaseActivity处理onRequestPermissionsResult回调,然后通过回调的方式,将结果传会Acitivty。
话不多说,上代码:
BaseActivity中的代码:
private OnBooleanListener onPermissionListener; /** *
权限请求(这个方法也有坑,如果检测的时候权限是拒绝的,那就会回调false,但如果检测的时候权限是询问,然后让用户授权权限的时候选了拒绝,那么下面这个代码返回的依旧是true,所以需要搭配另外一个方法用以实时检测权限是否通过)
* @param permission Manifest.permission.CAMERA * @param onBooleanListener
权限请求结果回调,true-通过 false-拒绝 */ public void permissionRequests(Activity
activity,String permission, OnBooleanListener onBooleanListener){
onPermissionListener=onBooleanListener;if
(ContextCompat.checkSelfPermission(activity, permission) !=
PackageManager.PERMISSION_GRANTED) {// Should we show an explanation? if
(ActivityCompat.shouldShowRequestPermissionRationale(activity,
Manifest.permission.READ_CONTACTS)) {//权限通过 onPermissionListener.onClick(true);
}else { //没有权限,申请一下 ActivityCompat.requestPermissions(activity, new
String[]{permission},1); } }else { //权限已有 if (onPermissionListener != null) {
onPermissionListener.onClick(true); } } } /** * 当此权限是必要的,而用户没有允许,允许弹出自定义的设置窗口 *
@param activity * @param onBooleanListener * @param permissions */ public void
permissionCheck(Activity activity, OnBooleanListener onBooleanListener, String
...permissions){ onPermissionListener = onBooleanListener;for (String
permission:permissions){if (ContextCompat.checkSelfPermission(activity,
permission)!= PackageManager.PERMISSION_GRANTED) {//没有权限,申请一下
onPermissionListener.onClick(false); break; } else { if
(permission.equals(permissions[permissions.length-1])){
onPermissionListener.onClick(true); } } } } @Override public void
onRequestPermissionsResult(int requestCode, String[] permissions, int[]
grantResults) {if (requestCode == 1) { if (grantResults[0] ==
PackageManager.PERMISSION_GRANTED) {//权限通过 if(onPermissionListener!=null){
onPermissionListener.onClick(true); } } else { //权限拒绝 if(onPermissionListener!=
null){ onPermissionListener.onClick(false); } } return; } super
.onRequestPermissionsResult(requestCode, permissions, grantResults); }
Activity中的调用代码:
permissionRequests(Manifest.permission.CAMERA, new OnBooleanListener() {
@Override public void onClick(boolean bln) { if(bln){
ToastUtils.showToast(getContext(),"权限通过"); }else{
ToastUtils.showToast(getContext(),"权限拒绝"); } } });
回调接口(新建一个interface)代码:
package com.imxiaoyu.common.impl; /** * 回调错误或者正确 * Created by 她叫我小渝 on
2016/11/1. */ public interface OnBooleanListener { void onClick(boolean bln); }
什么时候要什么时候调用……就这么简单,非要装逼长篇大论,蛋疼……
最后附带一个检测并跳转到系统设置页面(用户手动授权)的调用例子:
//检测录音权限 permissionCheck(getActivity(), new OnBooleanListener() { @Override
public void onClick(boolean bln) { if (!bln) { //当前没有权限 final ToastPopupWindow
toastPopupWindow = new ToastPopupWindow(getActivity());
//ToastPopupWindow是我自定义的对话框()
toastPopupWindow.setContent("录音功能必须允许录音权限才能使用,请前往设置页面许可录音权限后使用!");
toastPopupWindow.setOnClickLeftListener("取消",new View.OnClickListener() {
@Override public void onClick(View v) { //取消 toastPopupWindow.dismiss(); } });
toastPopupWindow.setOnClickRightListener("去设置", new View.OnClickListener() {
@Override public void onClick(View v) { //去设置 Intent intent = new Intent();
intent.setAction(Settings.ACTION_APPLICATION_DETAILS_SETTINGS); Uri uri =
Uri.fromParts("package", getActivity().getPackageName(), null);
intent.setData(uri); startActivity(intent); } }); getView().post(new Runnable()
{ @Override public void run() { toastPopupWindow.show(); } }); } } },
Manifest.permission.RECORD_AUDIO);