获取动态权限

获取动态权限,第1张

概述importandroid.annotation.TargetApi;importandroid.app.Activity;importandroid.app.FragmentManager;importandroid.content.Context;importandroid.content.ContextWrapper;importandroid.content.Intent;importandroid.content.pm.PackageManager;importan
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 {   //写你需要的 *** 作}
总结

以上是内存溢出为你收集整理的获取动态权限全部内容,希望文章能够帮你解决获取动态权限所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/web/1112436.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-05-29
下一篇2022-05-29

发表评论

登录后才能评论

评论列表(0条)

    保存