android 权限, alert dialog

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);
 +    }
 +
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值