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);
+ }
+