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); + } +
阅读全文
1 0
- android 权限, alert dialog
- Alert Dialog
- <Android 基础(十五)> Alert Dialog
- Android弹窗插件 sweet-alert-dialog
- Android Studio 导入 Sweet-alert-dialog
- 好看的dialog,sweet Alert Dialog 导入Android Studio
- Android常用实例—Alert Dialog的使用
- Android漂亮的对话框项目sweet-alert-dialog
- Android漂亮的对话框项目sweet-alert-dialog
- Android漂亮的对话框项目sweet-alert-dialog
- Android漂亮的对话框项目sweet-alert-dialog
- Android中引用sweet-alert-dialog以及遇到的问题解决
- Android漂亮的对话框项目sweet-alert-dialog
- Android漂亮的对话框项目sweet-alert-dialog
- Android漂亮的对话框项目sweet-alert-dialog
- sweet-alert-dialog在在android studio应用问题说明
- Android Alert Dialog点击按钮对话框不关闭
- Android常用实例—Alert Dialog的使用
- 操作系统知识点总结
- DNS
- 手机号码 邮箱 IP地址的正则匹配
- [sdio] Common Information Area (CIA) 分析及初始化过程
- Android 之 QQ分享
- android 权限, alert dialog
- uva679
- 学习操作系统Os第一记
- UDP协议的网络编程
- 乐观锁与悲观锁
- 多管齐下显神威-2017逐浪CMS开启全新建站与WEB技术革命
- SSL2672 2017年8月8日提高组T3 题目(二分+spfa)
- 汉诺塔
- 排成一条线的纸牌博弈问题