android 权限, alert dialog

来源:互联网 发布:杭州萧山城市数据大脑 编辑:程序博客网 时间:2024/05/14 07:17

https://github.com/wanglianghai/LightPermission
同一组的任何一个权限被授权了,其他权限也自动被授权了
API 》=23
配置权限在配置清单里

<uses-permission android:name="android.permission.CALL_PHONE"/>

设置打电话权限的请求代码

public static final int PERMISSIONS_REQUEST_CALL_PHONE = 1;

检查权限

private void call() {        if (ActivityCompat.checkSelfPermission(MainActivity.this,                Manifest.permission.CALL_PHONE) != PackageManager.PERMISSION_GRANTED) {            ActivityCompat.requestPermissions(MainActivity.this,                    new String[]{Manifest.permission.CALL_PHONE},                    PERMISSIONS_REQUEST_CALL_PHONE);        } else {            callPhone();        }    }

一个行动intent,即隐士的intent启动

 private void callPhone() {        Intent intent = new Intent(Intent.ACTION_CALL, Uri.parse("tel:" + "10086"));        try {            startActivity(intent);        } catch (SecurityException e) {            e.printStackTrace();        }    }

权限回调

 @Override    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {        super.onRequestPermissionsResult(requestCode, permissions, grantResults);        if (requestCode == PERMISSIONS_REQUEST_CALL_PHONE) {            if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {                callPhone();            } else {                //不在询问                if (!ActivityCompat.shouldShowRequestPermissionRationale(                        this, Manifest.permission.CALL_PHONE)) {                Toast.makeText(this, "permission denied", Toast.LENGTH_SHORT).show();            }        }    }
AlertDialog dialog = new AlertDialog.Builder(this)                            .setMessage("该功能需要访问电话权限,不开启将无法正常工作")                            .setPositiveButton("确定", new DialogInterface.OnClickListener() {                                @Override                                public void onClick(DialogInterface dialog, int which) {                                }                            })                            .create();                    dialog.show();                }

别人的封装

https://github.com/Android-Mu/SelectPhotoDemo/

package com.example.mjj.selectphotodemo.utils; + +import android.annotation.TargetApi; +import android.app.Activity; +import android.content.Context; +import android.content.DialogInterface; +import android.content.Intent; +import android.content.pm.PackageManager; +import android.net.Uri; +import android.os.Build; +import android.provider.Settings; +import android.support.v4.content.ContextCompat; +import android.support.v7.app.AlertDialog; + +import java.util.ArrayList; +import java.util.List; + +/** + * Description:Android6.0运行时权限工具类 + * <p> + * Created by code小生 on 2016/12/30. + */ + +public class MPermissionUtils { + +    private static int mRequestCode = -1; + +    public static void requestPermissionsResult(Activity activity, int requestCode +            , String[] permission, OnPermissionListener callback) { +        requestPermissions(activity, requestCode, permission, callback); +    } + +    public static void requestPermissionsResult(android.app.Fragment fragment, int requestCode +            , String[] permission, OnPermissionListener callback) { +        requestPermissions(fragment, requestCode, permission, callback); +    } + +    public static void requestPermissionsResult(android.support.v4.app.Fragment fragment, int requestCode +            , String[] permission, OnPermissionListener callback) { +        requestPermissions(fragment, requestCode, permission, callback); +    } + +    /** +     * 请求权限处理 +     * +     * @param object      activity or fragment +     * @param requestCode 请求码 +     * @param permissions 需要请求的权限 +     * @param callback    结果回调 +     */ +    @TargetApi(Build.VERSION_CODES.M) +    private static void requestPermissions(Object object, int requestCode +            , String[] permissions, OnPermissionListener callback) { + +        checkCallingObjectSuitability(object); +        mOnPermissionListener = callback; + +        if (checkPermissions(getContext(object), permissions)) { +            if (mOnPermissionListener != null) +                mOnPermissionListener.onPermissionGranted(); +        } else { +            List<String> deniedPermissions = getDeniedPermissions(getContext(object), permissions); +            if (deniedPermissions.size() > 0) { +                mRequestCode = requestCode; +                if (object instanceof Activity) { +                    ((Activity) object).requestPermissions(deniedPermissions +                            .toArray(new String[deniedPermissions.size()]), requestCode); +                } else if (object instanceof android.app.Fragment) { +                    ((android.app.Fragment) object).requestPermissions(deniedPermissions +                            .toArray(new String[deniedPermissions.size()]), requestCode); +                } else if (object instanceof android.support.v4.app.Fragment) { +                    ((android.support.v4.app.Fragment) object).requestPermissions(deniedPermissions +                            .toArray(new String[deniedPermissions.size()]), requestCode); +                } else { +                    mRequestCode = -1; +                } +            } +        } +    } + +    /** +     * 获取上下文 +     */ +    private static Context getContext(Object object) { +        Context context; +        if (object instanceof android.app.Fragment) { +            context = ((android.app.Fragment) object).getActivity(); +        } else if (object instanceof android.support.v4.app.Fragment) { +            context = ((android.support.v4.app.Fragment) object).getActivity(); +        } else { +            context = (Activity) object; +        } +        return context; +    } + +    /** +     * 请求权限结果,对应onRequestPermissionsResult()方法。 +     */ +    public static void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) { +        if (mRequestCode != -1 && requestCode == mRequestCode) { +            if (verifyPermissions(grantResults)) { +                if (mOnPermissionListener != null) +                    mOnPermissionListener.onPermissionGranted(); +            } else { +                if (mOnPermissionListener != null) +                    mOnPermissionListener.onPermissionDenied(); +            } +        } +    } + +    /** +     * 显示提示对话框 +     */ +    public static void showTipsDialog(final Context context) { +        new AlertDialog.Builder(context) +                .setTitle("提示信息") +                .setMessage("当前应用缺少必要权限,该功能暂时无法使用。如若需要,请单击【确定】按钮前往设置中心进行权限授权。") +                .setNegativeButton("取消", null) +                .setPositiveButton("确定", new DialogInterface.OnClickListener() { +                    @Override +                    public void onClick(DialogInterface dialog, int which) { +                        startAppSettings(context); +                    } +                }).show(); +    } + +    /** +     * 启动当前应用设置页面 +     */ +    private static void startAppSettings(Context context) { +        Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS); +        intent.setData(Uri.parse("package:" + context.getPackageName())); +        context.startActivity(intent); +    } + +    /** +     * 验证权限是否都已经授权 +     */ +    private static boolean verifyPermissions(int[] grantResults) { +        for (int grantResult : grantResults) { +            if (grantResult != PackageManager.PERMISSION_GRANTED) { +                return false; +            } +        } +        return true; +    } + +    /** +     * 获取权限列表中所有需要授权的权限 +     * +     * @param context     上下文 +     * @param permissions 权限列表 +     * @return +     */ +    private static List<String> getDeniedPermissions(Context context, String... permissions) { +        List<String> deniedPermissions = new ArrayList<>(); +        for (String permission : permissions) { +            if (ContextCompat.checkSelfPermission(context, permission) == PackageManager.PERMISSION_DENIED) { +                deniedPermissions.add(permission); +            } +        } +        return deniedPermissions; +    } + +    /** +     * 检查所传递对象的正确性 +     * +     * @param object 必须为 activity or fragment +     */ +    private static void checkCallingObjectSuitability(Object object) { +        if (object == null) { +            throw new NullPointerException("Activity or Fragment should not be null"); +        } + +        boolean isActivity = object instanceof Activity; +        boolean isSupportFragment = object instanceof android.support.v4.app.Fragment; +        boolean isAppFragment = object instanceof android.app.Fragment; + +        if (!(isActivity || isSupportFragment || isAppFragment)) { +            throw new IllegalArgumentException( +                    "Caller must be an Activity or a Fragment"); +        } +    } + +    /** +     * 检查所有的权限是否已经被授权 +     * +     * @param permissions 权限列表 +     * @return +     */ +    private static boolean checkPermissions(Context context, String... permissions) { +        if (isOverMarshmallow()) { +            for (String permission : permissions) { +                if (ContextCompat.checkSelfPermission(context, permission) == PackageManager.PERMISSION_DENIED) { +                    return false; +                } +            } +        } +        return true; +    } + +    /** +     * 判断当前手机API版本是否 >= 6.0 +     */ +    private static boolean isOverMarshmallow() { +        return Build.VERSION.SDK_INT >= Build.VERSION_CODES.M; +    } + +    public interface OnPermissionListener { +        void onPermissionGranted(); + +        void onPermissionDenied(); +    } + +    private static OnPermissionListener mOnPermissionListener; + +}
 // 检查权限 +//        checkPerm(); +        MPermissionUtils.requestPermissionsResult(PhotoPickerActivity.this, 1, +                new String[]{Manifest.permission.CAMERA, Manifest.permission.WRITE_EXTERNAL_STORAGE, +                        Manifest.permission.READ_EXTERNAL_STORAGE}, +                new MPermissionUtils.OnPermissionListener() { +                    @Override +                    public void onPermissionGranted() { +                        getPhotosTask.execute(); +                    } + +                    @Override +                    public void onPermissionDenied() { +                        MPermissionUtils.showTipsDialog(PhotoPickerActivity.this); +                    } +                }); + +//        getPhotosTask.execute();      }      private void initView() { @@ -174,6 +197,65 @@ public void onClick(View v) {          }      } +    /** +     * Android6.0检测权限 +     */ +    private void checkPerm() { +        /**1.在AndroidManifest文件中添加需要的权限。 +         * +         * 2.检查权限 +         *这里涉及到一个API,ContextCompat.checkSelfPermission, +         * 主要用于检测某个权限是否已经被授予,方法返回值为PackageManager.PERMISSION_DENIED +         * 或者PackageManager.PERMISSION_GRANTED。当返回DENIED就需要进行申请授权了。 +         * */ +        if (ContextCompat.checkSelfPermission(PhotoPickerActivity.this, Manifest.permission.CAMERA) +                != PackageManager.PERMISSION_GRANTED) { +            //权限没有被授予 + +            /**3.申请授权 +             * @param +             *  @param activity The target activity.(Activity|Fragment、) +             * @param permissions The requested permissions.(权限字符串数组) +             * @param requestCode Application specific request code to match with a result(int型申请码) +             *    reported to {@link OnRequestPermissionsResultCallback#onRequestPermissionsResult( +             *int, String[], int[])}. +             * */ +            ActivityCompat.requestPermissions(this, +                    new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE, +                            Manifest.permission.READ_EXTERNAL_STORAGE, +                            Manifest.permission.CAMERA}, +                    1001); +        } else { +            //权限被授予 直接操作 +//            choosePhoto(); +            getPhotosTask.execute(); +        } +    } + +    /*** +     * 4.处理权限申请回调 +     */ + +    @Override +    public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) { +//        if (requestCode == 1001) { +//            if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED +//                    && grantResults[1] == PackageManager.PERMISSION_GRANTED +//                    && grantResults[2] == PackageManager.PERMISSION_GRANTED) { +//                //权限被授予 +//                Toast.makeText(PhotoPickerActivity.this, "Permission success", Toast.LENGTH_SHORT).show(); +//                getPhotosTask.execute(); +//            } else { +//                // Permission Denied +//                Toast.makeText(PhotoPickerActivity.this, "Permission Denied", Toast.LENGTH_SHORT).show(); +//            } +//            return; +//        } + +        MPermissionUtils.onRequestPermissionsResult(requestCode, permissions, grantResults); +        super.onRequestPermissionsResult(requestCode, permissions, grantResults); +    } +
原创粉丝点击