android 权限封装(思路来至于RxPermissions)

思路很简单,就是我们自定义一个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<String> mPermissionList = new ArrayList<>();
        for (int i=0;i<permissonList.length;i++){
            if ((ContextCompat.checkSelfPermission(getContext(), permissonList[i]) != PackageManager.PERMISSION_GRANTED)
                    || shouldShowRequestPermissionRationale(permissonList[i])){
                mPermissionList.add(permissonList[i]);
            }
        }

        if (mPermissionList.size()>0) {
            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
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值