获取动态权限

import android.annotation.TargetApi;
import android.app.Activity;
import android.app.FragmentManager;
import android.content.Context;
import android.content.ContextWrapper;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.net.Uri;
import android.os.Build;

/**
 * @author nks
 * @date 2018/11/30
 * 6.0权限申请工具类
 */
public class FastPermission {
    private static FastPermission ourInstance = null;

    private FastPermission() {
    }

    public static FastPermission getInstance() {
        // 加入双重校验锁
        // 校验锁1:第1个if
        if (ourInstance == null) {
            synchronized (FastPermission.class) {
                // 校验锁2:第2个 if
                if (ourInstance == null) {
                    ourInstance = new FastPermission();
                }
            }
        }
        return ourInstance;
    }

    /**
     * 检查指定权限是否已经获取
     */
    @TargetApi(Build.VERSION_CODES.M)
    public boolean isAccept(Context context, String permission) {
        if (!isNeedCheck(context)) {
            return true;
        } else {
            return context.checkSelfPermission(permission) == PackageManager.PERMISSION_GRANTED;
        }

    }

    /**
     * 判断是否需要检查权限。运行版本大于6.0并且使用该库的targetSdkVersion大于23时才检查
     *
     * @return 返回true代表版本号大于6.0需要检查权限
     */
    public boolean isNeedCheck(Context context) {
        int targetSdkVersion = context.getApplicationInfo().targetSdkVersion;
        return Build.VERSION.SDK_INT >= 23 && targetSdkVersion >= 23;
    }

    /**
     * 跳转到应用的设置界面
     */
    public void goToAppDetailSetting(Context context) {
        Intent localIntent = new Intent();
        localIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        localIntent.setAction("android.settings.APPLICATION_DETAILS_SETTINGS");
        localIntent.setData(Uri.fromParts("package", context.getPackageName(), null));
        context.startActivity(localIntent);
    }

    /**
     * 使用Fragment申请权限
     *
     * @param callback 权限申请 成功、失败回调
     * @param perms    权限列表数组
     */
    public void request(Context context, String[] perms, PermissionCallback callback) {
        PermissionFragment fragment = null;
        FragmentManager fm = getActivity(context).getFragmentManager();
        fragment = (PermissionFragment) fm.findFragmentByTag(PermissionFragment.class.getSimpleName() + "tag");
        if (fragment == null) {
            fragment = new PermissionFragment();
            fm.beginTransaction()
                    .add(fragment, PermissionFragment.class.getSimpleName() + "tag")
                    .commitAllowingStateLoss();
        }
        fragment.requestMyPermission(context, perms, callback);
    }

    /**
     * 上面方法在某些情况下失灵,所以使用该方法 by txs
     */
    public PermissionFragment initFragment(Context context) {
        PermissionFragment permissionFragment = null;
        FragmentManager fm = getActivity(context).getFragmentManager();
        permissionFragment = (PermissionFragment) fm.findFragmentByTag(PermissionFragment.class.getSimpleName() + "tag");
        if (permissionFragment == null) {
            permissionFragment = new PermissionFragment();
            fm.beginTransaction()
                    .add(permissionFragment, PermissionFragment.class.getSimpleName() + "tag")
                    .commitAllowingStateLoss();
            fm.executePendingTransactions();
        }
        return permissionFragment;
    }


    /**
     * 获取activity
     */
    private static Activity getActivity(Context context) {
        if (context instanceof Activity) {
            return (Activity) context;
        }
        if (context instanceof ContextWrapper) {
            ContextWrapper wrapper = (ContextWrapper) context;
            return getActivity(wrapper.getBaseContext());
        } else {
            return null;
        }

    }


}

 

import android.app.Fragment;
import android.content.Context;
import android.content.pm.PackageManager;
import android.os.Build;
import android.os.Bundle;

import java.util.ArrayList;
import java.util.List;

/**
 * @author nks
 * @date 2018/11/30
 * 使用fragment进行6.0权限申请 ,避免v4以及v7包的问题
 */
public class PermissionFragment extends Fragment {
    private PermissionCallback mPermissionCallback;
    //权限回调的标识
    private static final int REQUEST_CODE = 0X0122;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

    }

    public void requestMyPermission(Context context, final String[] perms, final PermissionCallback callback) {
        mPermissionCallback = callback;
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
            List<String> permissionList = new ArrayList<>();
            for (String permission : perms) {
                //查找是否有某个权限
                if (!FastPermission.getInstance().isAccept(context, permission)) {
                    permissionList.add(permission);
                }
            }
            if (permissionList.size() > 0) {
                //申请权限
                PermissionFragment.this.requestPermissions(permissionList.toArray(new String[]{}), REQUEST_CODE);
            }

        }
    }


    @Override
    public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        switch (requestCode) {
            case REQUEST_CODE:
                if (grantResults.length > 0) {
                    //未获得的权限组合
                    List<String> deniedList = new ArrayList<String>();
                    for (int j = 0; j < grantResults.length; j++) {
                        int grantResult = grantResults[j];
                        String permission = permissions[j];
                        if (grantResult != PackageManager.PERMISSION_GRANTED) {
                            deniedList.add(permission);
                        }
                    }
                    //已全部允许
                    if (deniedList.isEmpty()) {
                        mPermissionCallback.onGranted();
                    } else {
                        mPermissionCallback.onDenied(deniedList);
                    }
                }

                break;
            default:
                break;
        }

    }


}

 

import java.util.List;

/**
 * @author nks
 * @date 2018/11/30
 * 6.0权限回调
 */
public interface PermissionCallback {
    /**
     * 权限允许
     */
    void onGranted();

    /**
     * 权限拒绝
     *
     * @param perms 被拒绝的权限集合
     */
    void onDenied(List<String> perms);
}

具体使用方式

permissionFragment = FastPermission.getInstance().initFragment(mContext);
/**
 * 适配android6.0所需要的权限,写入你所需要的权限
 */
public static final String[] PERMISSION_ARRAY = {Manifest.permission.INTERNET};
//适配6.0权限
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
    //需要的权限
    String[] permission = Config.PERMISSION_ARRAY;
    //申请权限列表
    List<String> permissionList = new ArrayList<>();
    for (String per : permission) {
        if (!FastPermission.getInstance().isAccept(mContext, per)) {
            //没有权限则加入list
            permissionList.add(per);
        }
    }
    if (permissionList.size() > 0) {
        if (permissionFragment.isAdded()) {
            permissionFragment.requestMyPermission(mContext, permissionList.toArray(new String[]{}), new PermissionCallback() {
                @Override
                public void onGranted() {
                    //获得权限成功
                }

                @Override
                public void onDenied(List<String> perms) {
                    //有权限未获得
                }
            });
        }

    } else {
        //已有权限

    }

    //6.0以下手机
} else {
   //写你需要的操作
}
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值