
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 { //写你需要的 *** 作} 总结 以上是内存溢出为你收集整理的获取动态权限全部内容,希望文章能够帮你解决获取动态权限所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)