android 权限封装(思路来至于RxPermissions)
16lz
2021-01-26
思路很简单,就是我们自定义一个Fragment,每次请求权限,都是用这个fragment去请求所需要的权限,那么回调的地方就固定了(就是会掉这个fragment对应的onRequestPermissionsResult(xxxx)函数中),具体代码如下:
PermissionFragment 类:
package com.example.androidfram.utils;import android.app.Fragment;import android.content.pm.PackageManager;import android.os.Build;import android.support.annotation.NonNull;import android.support.annotation.RequiresApi;import android.support.v4.content.ContextCompat;import java.util.ArrayList;import java.util.List;public class PermissionFragment extends Fragment{private static final int PERMISSIONS_REQUEST_BACK =142 ;private PermissionUtil.PermissionsListener permissionsListener; @RequiresApi(api = Build.VERSION_CODES.M) public void fetchPermisson(String[] permissonList, final PermissionUtil.PermissionsListener permissionsListener){ this.permissionsListener=permissionsListener; List mPermissionList = new ArrayList<>(); for (int i=0;i0) { requestPermissions(permissonList, PERMISSIONS_REQUEST_BACK); }else { permissionsListener.permissonApplied(); } } @Override public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { super.onRequestPermissionsResult(requestCode, permissions, grantResults); permissionsListener.accept(requestCode, permissions, grantResults); }}
PermissionUtil 类:
package com.example.androidfram.utils;import android.app.Activity;import android.app.FragmentManager;import android.os.Build;import android.support.annotation.NonNull;import android.support.annotation.RequiresApi;import com.example.androidfram.fragments.Fragment;public class PermissionUtil { private PermissionFragment permissionFragment; private final String TAG = "permissionFragment"; public PermissionUtil(Activity activity){ permissionFragment=getRxPermissionsFragment(activity); } public PermissionUtil(Fragment fragment){ permissionFragment=getRxPermissionsFragment(fragment.getActivity()); } //一次性请求多个 @RequiresApi(api = Build.VERSION_CODES.M) public void fetchPermisson(String[] permissonList, final PermissionsListener permissionsListener){ permissionFragment.fetchPermisson(permissonList,permissionsListener); } private PermissionFragment getRxPermissionsFragment(Activity activity) { PermissionFragment rxPermissionsFragment = findRxPermissionsFragment(activity); boolean isNewInstance = rxPermissionsFragment == null; if (isNewInstance) { rxPermissionsFragment = new PermissionFragment(); FragmentManager fragmentManager = activity.getFragmentManager(); fragmentManager .beginTransaction() .add(rxPermissionsFragment, TAG) .commitAllowingStateLoss(); fragmentManager.executePendingTransactions(); } return rxPermissionsFragment; } private PermissionFragment findRxPermissionsFragment(Activity activity) { return (PermissionFragment) activity.getFragmentManager().findFragmentByTag(TAG); } public interface PermissionsListener{ //申请权限回调接口 void accept(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults); //权限申请全部通过后的回调接口 void permissonApplied(); }}
最后就是,那怎么调用呢?
//获取权限private void initPermission() {String[] permissonList = new String[]{ Manifest.permission.INTERNET, Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.READ_PHONE_STATE, Manifest.permission.RECORD_AUDIO, Manifest.permission.ACCESS_COARSE_LOCATION, Manifest.permission.CALL_PHONE, Manifest.permission.CAMERA}; if (Build.VERSION.SDK_INT >= 23) { //权限请求 new PermissionUtil(this).fetchPermisson(permissonList, new PermissionUtil.PermissionsListener() { @Override public void accept(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { } @Override public void permissonApplied() { } }); } else { }}
更多相关文章
- retrofit2+okhttp3+rxjava网络封装
- Android(安卓)APP自动更新
- Android(安卓)显示系统分析
- Android(安卓)studio 获取手机联系人和号码并输出
- 【Android(安卓)Debug】 Skipping insecure file ...
- Android:混合轮播视频和图片
- 关于 android Intent 传对象和对象数组的一些操作
- Android入门进阶教程(13)-ServiceManager服务管理详解
- Android(安卓)OkHttp, 一行代码 OkHttp提升请求稳定性