思路很简单,就是我们自定义一个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 {        }}

更多相关文章

  1. retrofit2+okhttp3+rxjava网络封装
  2. Android(安卓)APP自动更新
  3. Android(安卓)显示系统分析
  4. Android(安卓)studio 获取手机联系人和号码并输出
  5. 【Android(安卓)Debug】 Skipping insecure file ...
  6. Android:混合轮播视频和图片
  7. 关于 android Intent 传对象和对象数组的一些操作
  8. Android入门进阶教程(13)-ServiceManager服务管理详解
  9. Android(安卓)OkHttp, 一行代码 OkHttp提升请求稳定性

随机推荐

  1. android FM播放时拔出耳机后FM APP自动cl
  2. android Intent打开各种类型文件
  3. 控件布局_FrameLayout(网格布局)
  4. 【Android】SAX解析之错误纠正!!
  5. android获取SIM卡信息和手机号码
  6. Android通过SOAP协议和基于XFire实现的we
  7. IntelHaxm : 加速android模拟器启动速度(S
  8. MapView学习Demo2
  9. Kotlin Android(安卓)WebView与H5的相互
  10. android 比较靠谱的图片压缩