package com.wind.permission;
import android.app.Activity;
import android.app.AlertDialog;
import android.content.ComponentName;
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.text.TextUtils;
import androidx.core.app.ActivityCompat;
import androidx.core.content.ContextCompat;
/**
* 权限管理工具
* 快速解决权系统功能权限申请问题
* 一个个权限申请也太麻烦,这个批量申请能满足你的需求。
* 程序在android 6 版本 大于 23 时,权限需要申请,在配置表中设置的权限当拒绝后,导至功能失常,或闪退现象
* 调用checkPermission 申请权限回时调用 onRequestPermissionsResult
* 如有疑问请发信 或者在我的博客中留言
* @E-Mail:huangchonggao@21cn.com
* @author 白狼星
* @data 2020-01-21
*
*/
public class PermissionUtil {
static String[] permissions;
/**
*
* 检测权限是否己申请,通过在启动应用程序时检测,当需要时,会自动弹出提示请求权限
* @param context 请求的 Activity
* @param pms 关键的权限,也就是必须要的权限 当为null 时,申请的全部权限都是必需的
* @return 需要请求返回 false ,返回true时 全部权限都拿到
* @E-Mail:huangchonggao@21cn.com
* @author 白狼星
* @data 2020-01-21
*/
static public boolean checkPermission(Activity context,String[] pms){
int permissionCode=0;
int decode=0;
try {
// APP 权限
permissions = (pms!=null)?pms:context.getPackageManager().getPackageInfo(context.getPackageName(),PackageManager.GET_PERMISSIONS).requestedPermissions;
for(int i=0;i<permissions.length;i++){
System.out.println("PermissionUtil: " +permissions[i] );
//判断用户是否给这些权限授权
if(ContextCompat.checkSelfPermission(context, permissions[i]) != PackageManager.PERMISSION_GRANTED) {
permissionCode+=1;
//判断是否拒绝过
decode += ActivityCompat.shouldShowRequestPermissionRationale(context, permissions[i]) ? 1 : 0;
}
}
}catch (Exception e){
System.out.println("PermissionUtil checkPermission error :"+e.getMessage());
}
if(permissionCode>0) {
if(decode>0)
requestTip(context);
else
requestPermissions(context,permissions);
return false;
}
return true;
}
/**
* 请求获取权限 当权限需要申请时调用
* @param context 请求的 Activity
* @param perms 需要请求的权限
* @E-Mail:huangchonggao@21cn.com
* @author 白狼星
* @data 2020-01-21
*/
static public void requestPermissions(Activity context,String[] perms){
ActivityCompat.requestPermissions(context, perms, 1);
}
/**
* 引导用户到设置权限
* @param context 请求的 Activity
* @E-Mail:huangchonggao@21cn.com
* @author 白狼星
* @data 2020-01-21
*/
static public void toSetting(Context context){
Intent intent = new Intent();
intent.setAction("android.settings.APPLICATION_DETAILS_SETTINGS");
intent.setData(Uri.fromParts("package", context.getPackageName(), null));
context.startActivity(intent);
}
/**
* 提示请求权限 当拒绝了授权后,为提升用户体验,可以以弹窗的方式引导用户到设置中去进行设置
* @param context 请求的 Activity
* @E-Mail:huangchonggao@21cn.com
* @author 白狼星
* @data 2020-01-21
*/
static public void requestTip(final Activity context){
new AlertDialog.Builder(context)
.setMessage("为更好体验,需要开启权限才能使用此功能!")
.setPositiveButton("设置", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
toSetting(context);
}
})
.setNegativeButton("取消", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
context.finish();
}
})
.create()
.show();
}
/**
* 请求权限回调检测 如有拒绝 将直接引导到系统设置要求打开
* @param context 请求的 Activity
* @param requestCode
* @param permissions
* @param grantResults
* @E-Mail:huangchonggao@21cn.com
* @author 白狼星
* @data 2020-01-21
*/
static public void onRequestPermissionsResult(Activity context,int requestCode, String[] permissions, int[] grantResults) {
if(requestCode!=1)return;
int code=0;
if (grantResults.length <1)return;
//用户是否拒绝了权限
for (int i=0;i<grantResults.length;i++)
code+=(grantResults[i]!= PackageManager.PERMISSION_GRANTED)?1:0;
if(code==0)return;
requestTip(context);
}
/**
* 设置中打开权限管理界面
* 跟据不同厂商进行快捷目录界面
* @param context
*/
public static void gotoPermissionManager(Context context) {
String brand = Build.BRAND;//手机厂商
if (TextUtils.equals(brand.toLowerCase(), "redmi")
|| TextUtils.equals(brand.toLowerCase(), "xiaomi")) {
gotoMiuiPermissionManager(context);//小米
return;
}
if (TextUtils.equals(brand.toLowerCase(), "meizu")) {
gotoMeizuPermissionManager(context);
return;
}
if (TextUtils.equals(brand.toLowerCase(), "huawei")
|| TextUtils.equals(brand.toLowerCase(), "honor")) {
gotoHuaweiPermissionManager(context);
return;
}
toSetting(context);
}
/**
* 跳转到魅族的权限管理系统
*/
private static void gotoMeizuPermissionManager(Context context) {
try {
Intent intent = new Intent();
intent.setAction("com.meizu.safe.security.SHOW_APPSEC");
intent.addCategory(Intent.CATEGORY_DEFAULT);
intent.putExtra("packageName", context.getPackageName());
context.startActivity(intent);
} catch (Exception e) {
toSetting(context);
}
}
/**
* 跳转到miui的权限管理页面
*/
private static void gotoMiuiPermissionManager(Context context) {
try { // MIUI 8
Intent localIntent = new Intent();
localIntent.setAction("miui.intent.action.APP_PERM_EDITOR");
localIntent.setClassName("com.miui.securitycenter", "com.miui.permcenter.permissions.PermissionsEditorActivity");
localIntent.putExtra("extra_pkgname", context.getPackageName());
context.startActivity(localIntent);
} catch (Exception e) {
try { // MIUI 5/6/7
Intent localIntent = new Intent("miui.intent.action.APP_PERM_EDITOR");
localIntent.setClassName("com.miui.securitycenter", "com.miui.permcenter.permissions.AppPermissionsEditorActivity");
localIntent.putExtra("extra_pkgname", context.getPackageName());
context.startActivity(localIntent);
} catch (Exception e1) { // 否则跳转到应用详情
toSetting(context);
}
}
}
/**
* 华为的权限管理页面
*/
private static void gotoHuaweiPermissionManager(Context context) {
白狼星
- 粉丝: 3
- 资源: 11
最新资源
- MATLAB机器人运动学正逆解、动力学建模仿真与轨迹规划,雅克比矩阵求解.蒙特卡洛采样画出末端执行器工作空间 基于时间最优的改进粒子群优化算法机械臂轨迹规划设计 圆弧轨迹规划 机械臂绘制写字
- simulink 光伏MPPT模型 光伏遮荫时扰动观察法和粒子群MPPT的结果对比 图1为模型 图2为光伏遮荫时I-U曲线 图3为光伏遮荫时P-U曲线 图4为两种算法结果对比 图5为粒子群的仿真结果显
- HarmonyOS Next 抓取设备日志信息脚本
- FPGA运动目标检测仿真代码 硬件:正点原子达芬奇 新起点 软件:Vivado quartus 内容:ov5640配置和数据输出,rgb2ycbcr,帧差,腐蚀,膨胀,边框检测,加边框,hdm
- CATIA DMU转向系统运动仿真(可编辑,无参数) 悬架是麦弗逊式独立悬架 左右车轮相互独立,可单独上跳和下跳 转向系统齿轮齿条转向器,实现左右转向功能
- 铁木辛柯梁振动分析仿真 COMSOL案例还原及 此模型研究深梁的自由振动和强迫振动,使用铁木辛柯梁计算了特征频率、频率响应和瞬态分析的解
- 电动汽车三相车载充电机(OBC)模拟仿真 图一整体电路与控制图 图二直流母线电压曲线 图三有功无功曲线 图四电池参数曲线 图5进入逆变器端电流跟随电压曲线
- 博途S7-1200与台达伺服控制器RS485通讯 1.提供 2.提供源程序
- 小波时频图 cnn卷积分类
- 基于MATLAB的口罩佩戴检测系统
- 三相光伏储能并网NPC逆变器采用MPPT,中点电压平衡svpwm控制 图一整体结构电路与控制曲线 图二电流锁电网电压并随着发电功率变化而变化 图三,电流电压曲线放大图 图四 五点平NPC线电压曲线 图
- 模型预测控制的LCL型三相并网逆变器控制方法,FCS-MPC+并网电流控制+中点电压控制+SOGI 并附带参考文献,内容详实,适合电力电子入门仿真参考
- 计算机网络开发实战基础教程
- FPGA verilog实现图像SAD算法配置计算及AHB接口数据传输交互 具备3种窗口配置,包含计算、储存及AHB接口数据交互和状态查询功能
- maxwell电机电磁仿真 开关磁阻电机 电力磁双凸极电机 磁通切电机设计,仿真,分析
- 基于yolov7的海上船舶检测和识别(含源码和数据集) 总共六个类别:ore carrier,passenger ship,container ship,bulk cargo carrier,gene
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈