Android 【动态获取权限的工具类】

Android 【动态获取权限的工具类】

代码如下

public class PermissionsUtilX {

private PermissionsUtilX() {

}
/** * 危险权限,targetSdkVersion >=23必须动态申请 */
public static final class Permission {

private static final List<String> sCalendars = new ArrayList<>(2);
private static final List<String> sCameras = new ArrayList<>(1);
private static final List<String> sContactes = new ArrayList<>(3);
private static final List<String> sLocations = new ArrayList<>(2);
private static final List<String> sMicrophones = new ArrayList<>(1);
private static final List<String> sPhones = new ArrayList<>(7);
private static final List<String> sSensorses = new ArrayList<>(1);
private static final List<String> sSmses = new ArrayList<>(5);
private static final List<String> sStorages = new ArrayList<>(2);
static {

//Calendar
sCalendars.add(Calendar.READ_CALENDAR);
sCalendars.add(Calendar.WRITE_CALENDAR);
//Camera
sCameras.add(Camera.CAMERA);
//Contacts
sContactes.add(Contacts.WRITE_CONTACTS);
sContactes.add(Contacts.READ_CONTACTS);
sContactes.add(Contacts.GET_ACCOUNTS);
//Location
sLocations.add(Location.ACCESS_FINE_LOCATION);
sLocations.add(Location.ACCESS_COARSE_LOCATION);
//Microphone
sMicrophones.add(Microphone.RECORD_AUDIO);
//Phone
sPhones.add(Phone.READ_PHONE_STATE);
sPhones.add(Phone.CALL_PHONE);
sPhones.add(Phone.READ_CALL_LOG);
sPhones.add(Phone.WRITE_CALL_LOG);
sPhones.add(Phone.ADD_VOICEMAIL);
sPhones.add(Phone.USE_SIP);
sPhones.add(Phone.PROCESS_OUTGOING_CALLS);
//Sensors
sSensorses.add(Sensors.BODY_SENSORS);
//Sms
sSmses.add(Sms.SEND_SMS);
sSmses.add(Sms.RECEIVE_SMS);
sSmses.add(Sms.READ_SMS);
sSmses.add(Sms.RECEIVE_WAP_PUSH);
sSmses.add(Sms.RECEIVE_MMS);
//Storage
sStorages.add(Storage.READ_EXTERNAL_STORAGE);
sStorages.add(Storage.WRITE_EXTERNAL_STORAGE);
}
public static final class Calendar {

public static final String READ_CALENDAR = Manifest.permission.READ_CALENDAR;
public static final String WRITE_CALENDAR = Manifest.permission.WRITE_CALENDAR;
private static final String MSG = "日历";
}
public static final class Camera {

public static final String CAMERA = Manifest.permission.CAMERA;
private static final String MSG = "相机";
}
public static final class Contacts {

public static final String READ_CONTACTS = Manifest.permission.READ_CONTACTS;
public static final String WRITE_CONTACTS = Manifest.permission.WRITE_CONTACTS;
public static final String GET_ACCOUNTS = Manifest.permission.GET_ACCOUNTS;
private static final String MSG = "联系人";
}
public static final class Location {

public static final String ACCESS_FINE_LOCATION = Manifest.permission.ACCESS_FINE_LOCATION;
public static final String ACCESS_COARSE_LOCATION = Manifest.permission.ACCESS_COARSE_LOCATION;
private static final String MSG = "定位";
}
public static final class Microphone {

public static final String RECORD_AUDIO = Manifest.permission.RECORD_AUDIO;
private static final String MSG = "麦克风";
}
public static final class Phone {

public static final String READ_PHONE_STATE = Manifest.permission.READ_PHONE_STATE;
public static final String CALL_PHONE = Manifest.permission.CALL_PHONE;
public static final String READ_CALL_LOG = Manifest.permission.READ_CALL_LOG;
public static final String WRITE_CALL_LOG = Manifest.permission.WRITE_CALL_LOG;
public static final String ADD_VOICEMAIL = Manifest.permission.ADD_VOICEMAIL;
public static final String USE_SIP = Manifest.permission.USE_SIP;
public static final String PROCESS_OUTGOING_CALLS = Manifest.permission.PROCESS_OUTGOING_CALLS;
private static final String MSG = "电话";
}
public static final class Sensors {

public static final String BODY_SENSORS = Manifest.permission.BODY_SENSORS;
private static final String MSG = "传感器";
}
public static final class Sms {

public static final String SEND_SMS = Manifest.permission.SEND_SMS;
public static final String RECEIVE_SMS = Manifest.permission.RECEIVE_SMS;
public static final String READ_SMS = Manifest.permission.READ_SMS;
public static final String RECEIVE_WAP_PUSH = Manifest.permission.RECEIVE_WAP_PUSH;
public static final String RECEIVE_MMS = Manifest.permission.RECEIVE_MMS;
private static final String MSG = "短信";
}
public static final class Storage {

public static final String READ_EXTERNAL_STORAGE = Manifest.permission.READ_EXTERNAL_STORAGE;
public static final String WRITE_EXTERNAL_STORAGE = Manifest.permission.WRITE_EXTERNAL_STORAGE;
private static final String MSG = "存储";
}
}
public static final int SETTINGS_REQ_CODE = 99;
private static final String TAG = "PermissionsUtil";
private static final String KEY_DENIED_PERMISSIONS = "deniedPermissions";
private static final String KEY_REQUEST_CODE = "requestCode";
private static final int MSG_UI_HANDLER_DEAL_DENIED_PERMISSION = 100;
private static boolean sDebug = true;
private Object mObject;
private String[] mPermissions;
private int mRequestCode;
private String mRationaleTitle;
private String mPositiveText = "确定";
private String mNegativeText = "取消";
private Handler mUiHandler = new Handler(Looper.getMainLooper()) {

@Override
public void handleMessage(Message msg) {

switch (msg.what) {

case MSG_UI_HANDLER_DEAL_DENIED_PERMISSION:
Bundle data = msg.getData();
int requestCode = data.getInt(KEY_REQUEST_CODE);
String[] permissions = data.getStringArray(KEY_DENIED_PERMISSIONS);
Object object = msg.obj;
showAlertDialog(object, requestCode, permissions);
break;
}
}
};
private PermissionsUtilX(@NonNull Object object) {

if (isObjectIllegality(object))
throw new IllegalArgumentException("Activity or Fragment must implements IPermissionsCallback");
mObject = object;
}
public static PermissionsUtilX with(@NonNull Activity activity) {

return new PermissionsUtilX(activity);
}
public static PermissionsUtilX with(@NonNull Fragment fragment) {

return new PermissionsUtilX(fragment);
}
public static PermissionsUtilX with(@NonNull android.app.Fragment fragment) {

return new PermissionsUtilX(fragment);
}
public PermissionsUtilX permissions(@NonNull String... permissions) {

if (hasEmpty(permissions))
throw new IllegalArgumentException("permissions can't contain null");
mPermissions = permissions;
return this;
}
public PermissionsUtilX requestCode(int requestCode) {

mRequestCode = requestCode;
return this;
}
public PermissionsUtilX rationaleTitle(String title) {

mRationaleTitle = title;
return this;
}
public PermissionsUtilX positiveText(String positiveText) {

mPositiveText = positiveText;
return this;
}
public PermissionsUtilX negativeText(String negativeText) {

mNegativeText = negativeText;
return this;
}
public PermissionsUtilX isDebug(boolean isDebug) {

sDebug = isDebug;
return this;
}
public PermissionsUtilX request() {

request(mObject, mRequestCode, mPermissions);
return this;
}
public void request(Object object, int requestCode, String... permissions) {

if (needRequest() && notGrantedAllPermissions(getActivity(object), permissions)) {

List<String> unGrantedPermissionsList = createUnGrantedPermissionsList(object, permissions);
PLog.d("request---" + "requestCode : " + requestCode + "---unGrantedPermissionsList : " + unGrantedPermissionsList);
if (unGrantedPermissionsList.size() > 0) {

requestPermissions(object, requestCode, listToStringArray(unGrantedPermissionsList));
unGrantedPermissionsList.clear();
} else {

invokePermissionsGranted(object, requestCode, permissions);
}
unGrantedPermissionsList = null;
} else {

PLog.d("request---" + "requestCode : " + requestCode + "---permissionsGranted : " + stringArrayToList(permissions));
invokePermissionsGranted(object, requestCode, permissions);
}
}
private List<String> createUnGrantedPermissionsList(Object object, String... permissions) {

List<String> unGrantedPermissionsList = new ArrayList<>();
for (String permission : permissions) {

if (notGrantedPermission(getActivity(object), permission)) {

unGrantedPermissionsList.add(permission);
}
}
return unGrantedPermissionsList;
}
@TargetApi(Build.VERSION_CODES.M)
private void requestPermissions(Object object, int requestCode, String... permissions) {

PLog.d("requestPermissions---" + "requestCode : " + requestCode + "---requestPermissions : " + stringArrayToList(permissions));
if (object instanceof Activity) {

ActivityCompat.requestPermissions((Activity) object, permissions, requestCode);
} else if (object instanceof Fragment) {

((Fragment) object).requestPermissions(permissions, requestCode);
} else if (object instanceof android.app.Fragment) {

((android.app.Fragment) object).requestPermissions(permissions, requestCode);
}
}
/** * @param object * @param requestCode * @param deniedPermissions denied permissions * @return */
private void showAlertDialog(final Object object, final int requestCode, final String... deniedPermissions) {

PLog.d("showAlertDialog --- " + "requestCode : " + requestCode + "--- deniedPermissions : " + stringArrayToList(deniedPermissions));
AlertDialog.Builder builder = new AlertDialog.Builder(getActivity(mObject));
if (!TextUtils.isEmpty(mRationaleTitle)) {

builder.setTitle(mRationaleTitle);
}
builder.setMessage(createRationaleMsg(getActivity(object), deniedPermissions))
.setPositiveButton(mPositiveText, new DialogInterface.OnClickListener() {

@Override
public void onClick(DialogInterface dialog, int which) {

goSetting(object);
}
})
.setNegativeButton(mNegativeText, new DialogInterface.OnClickListener() {

@Override
public void onClick(DialogInterface dialog, int which) {

invokePermissionsDenied(object, requestCode, deniedPermissions);
}
})
.create()
.show();
}
private boolean needRequest() {

return Build.VERSION.SDK_INT >= 23;
}
private Activity getActivity(Object object) {

Activity activity = null;
if (object instanceof Activity) {

activity = (Activity) object;
} else if (object instanceof Fragment) {

activity = ((Fragment) object).getActivity();
} else if (object instanceof android.app.Fragment) {

activity = ((android.app.Fragment) object).getActivity();
}
return activity;
}
public boolean grantedPermission(Activity activity, String permission) {

return ContextCompat.checkSelfPermission(activity, permission) == PackageManager.PERMISSION_GRANTED;
}
public boolean notGrantedPermission(Activity activity, String permission) {

return !grantedPermission(activity, permission);
}
public boolean grantedAllPermissions(Activity activity, String... permissions) {

for (String permission : permissions) {

if (notGrantedPermission(activity, permission)) {

return false;
}
}
return true;
}
public boolean notGrantedAllPermissions(Activity activity, String... permissions) {

return !grantedAllPermissions(activity, permissions);
}
private void dealDeniedPermissions(Object object, int requestCode, String... deniedPermissions) {

PLog.d("dealDeniedPermissions --- " + "requestCode : " + requestCode + "--- deniedPermissions : " + stringArrayToList(deniedPermissions));
Message message = mUiHandler.obtainMessage();
Bundle bundle = new Bundle();
bundle.putStringArray(KEY_DENIED_PERMISSIONS, deniedPermissions);
bundle.putInt(KEY_REQUEST_CODE, requestCode);
message.setData(bundle);
message.obj = object;
message.what = MSG_UI_HANDLER_DEAL_DENIED_PERMISSION;
mUiHandler.sendMessage(message);
}
private boolean isObjectLegal(Object object) {

return (object instanceof IPermissionsCallback);
}
private boolean isObjectIllegality(Object object) {

return !isObjectLegal(object);
}
private boolean hasEmpty(String... strings) {

boolean hasEmpty = false;
if (strings != null && strings.length > 0) {

for (String s : strings) {

if (TextUtils.isEmpty(s)) {

hasEmpty = true;
break;
}
}
} else {

hasEmpty = true;
}
return hasEmpty;
}
private String[] listToStringArray(List<String> stringList) {

return stringList.toArray(new String[stringList.size()]);
}
private List<String> stringArrayToList(String[] strings) {

return Arrays.asList(strings);
}
private String getAppName(Context context) {

String appName = "";
PackageManager packageManager = context.getPackageManager();
try {

ApplicationInfo applicationInfo = packageManager.getApplicationInfo(context.getPackageName(), 0);
appName = (String) packageManager.getApplicationLabel(applicationInfo);
} catch (PackageManager.NameNotFoundException e) {

e.printStackTrace();
}
return appName;
}
private String createRationaleMsg(Context context, String... permissions) {

String permissionsMsg = createPermissionsMsg(permissions);
permissionsMsg = permissionsMsg.substring(0, permissionsMsg.length() - 1);
return getAppName(context) + "需要" + permissionsMsg + "权限,是否去设置";
}
private String createPermissionsMsg(String... permissions) {

StringBuilder builder = new StringBuilder();
boolean grantedCalendar = false;
boolean grantedCamera = false;
boolean grantedContacts = false;
boolean grantedLocation = false;
boolean grantedMicrophone = false;
boolean grantedPhone = false;
boolean grantedSensors = false;
boolean grantedSms = false;
boolean grantedStorage = false;
for (String permission : permissions) {

if (!grantedCalendar && Permission.sCalendars.contains(permission)) {

builder.append(Permission.Calendar.MSG);
builder.append("、");
grantedCalendar = true;
}
if (!grantedCamera && Permission.sCameras.contains(permission)) {

builder.append(Permission.Camera.MSG);
builder.append("、");
grantedCamera = true;
}
if (!grantedContacts && Permission.sContactes.contains(permission)) {

builder.append(Permission.Contacts.MSG);
builder.append("、");
grantedContacts = true;
}
if (!grantedLocation && Permission.sLocations.contains(permission)) {

builder.append(Permission.Location.MSG);
builder.append("、");
grantedLocation = true;
}
if (!grantedMicrophone && Permission.sMicrophones.contains(permission)) {

builder.append(Permission.Microphone.MSG);
builder.append("、");
grantedMicrophone = true;
}
if (!grantedPhone && Permission.sPhones.contains(permission)) {

builder.append(Permission.Phone.MSG);
builder.append("、");
grantedPhone = true;
}
if (!grantedSensors && Permission.sSensorses.contains(permission)) {

builder.append(Permission.Sensors.MSG);
builder.append("、");
grantedSensors = true;
}
if (!grantedSms && Permission.sSmses.contains(permission)) {

builder.append(Permission.Sms.MSG);
builder.append("、");
grantedSms = true;
}
if (!grantedStorage && Permission.sStorages.contains(permission)) {

builder.append(Permission.Storage.MSG);
builder.append("、");
grantedStorage = true;
}
}
return builder.toString();
}
private IPermissionsCallback getPermissionsCallback(Object object) {

return (IPermissionsCallback) object;
}
private void invokePermissionsGranted(Object object, int requestCode, String... permissions) {

getPermissionsCallback(object).onPermissionsGranted(requestCode, permissions);
}
private void invokePermissionsDenied(Object object, int requestCode, String... permissions) {

getPermissionsCallback(object).onPermissionsDenied(requestCode, permissions);
}
public interface IPermissionsCallback {

void onPermissionsGranted(int requestCode, String... permission);
void onPermissionsDenied(int requestCode, String... permission);
}
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {

if (requestCode == mRequestCode) {

List<String> deniedPermissions = new ArrayList<>();
for (int i = 0; i < grantResults.length; i++) {

if (grantResults[i] != PackageManager.PERMISSION_GRANTED)
deniedPermissions.add(permissions[i]);
}
PLog.d("onRequestPermissionsResult--- " + "requestCode : " + requestCode + "--- deniedPermissions : " + deniedPermissions);
if (deniedPermissions.size() > 0) {

dealDeniedPermissions(mObject, requestCode, listToStringArray(deniedPermissions));
} else {

invokePermissionsGranted(mObject, requestCode, permissions);
}
}
}
public void onActivityResult(int requestCode, int resultCode, Intent data) {

if (requestCode == SETTINGS_REQ_CODE) {

List<String> unGrantedPermissionsList = createUnGrantedPermissionsList(mObject, mPermissions);
PLog.d("onActivityResult --- " + "requestCode : " + requestCode + "---" + "unGrantedPermissionsList : " + unGrantedPermissionsList);
if (unGrantedPermissionsList.size() > 0) {

invokePermissionsDenied(mObject, mRequestCode, listToStringArray(unGrantedPermissionsList));
} else {

invokePermissionsGranted(mObject, mRequestCode, mPermissions);
}
}
}
private void goSetting(Object object) {

PLog.d("goSetting");
Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
Uri uri = Uri.fromParts("package", getActivity(object).getPackageName(), null);
intent.setData(uri);
if (object instanceof Activity) {

((Activity) object).startActivityForResult(intent, SETTINGS_REQ_CODE);
} else if (object instanceof Fragment) {

((Fragment) object).startActivityForResult(intent, SETTINGS_REQ_CODE);
} else if (object instanceof android.app.Fragment) {

((android.app.Fragment) object).startActivityForResult(intent, SETTINGS_REQ_CODE);
}
}
static final class PLog {

private static void d(String msg) {

if (sDebug)
Log.d(TAG, msg);
}
private static void e(String msg) {

if (sDebug)
Log.e(TAG, msg);
}
}
}

使用方法

   private void getPermission() {

permissionsUtil = PermissionsUtilX.with(this)
.requestCode(0)
.isDebug(true)
.permissions(PermissionsUtilX.Permission.Storage.WRITE_EXTERNAL_STORAGE)
.request();
}

当前Activity需要实现PermissionsUtilX.IPermissionsCallback接口

   @Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {

//需要调用onRequestPermissionsResult
permissionsUtil.onRequestPermissionsResult(requestCode, permissions, grantResults);
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
}
@Override
public void onPermissionsGranted(int requestCode, String... permission) {

//权限获取回调
Log.e("555", "456" );
}
@Override
public void onPermissionsDenied(int requestCode, String... permission) {

//权限被拒绝回调
}
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/2828.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(1)


相关推荐

  • oracle sequence order_二次序列

    oracle sequence order_二次序列文章目录1概述2语法2.1授权2.2创建序列2.3查询、修改、删除2.4使用序列3扩展3.1cache详解3.2cycle详解3.3常用获取序列的工具包1概述1.序列是什么:整数,一般是指从1开始的正整数2.序列有啥用:自动生成’主键’3.注意事项(1)建议’循环’使用序列(order),避免精度超出报错如:最终序列=当前年份+产生的序列(2)建议不对序列进行排序(noord..

    2022年10月19日
  • C语言 爱心代码_用c语言编辑一个爱心

    C语言 爱心代码_用c语言编辑一个爱心需要的自取,看明白了就可以自己修改爱心的大小#include<stdio.h>intmain(){intn,k,m,p,q;for(n=1;n<=2;n++){for(k=1;k<=15-n;k++)printf(“”);for(m=1;m<=2*n;m++)printf(“*”);for(p=1;p<=5-2*

    2022年10月13日
  • Burp Suite抓包讲解「建议收藏」

    Burp Suite抓包讲解「建议收藏」目录BurpSuite安装介绍BurpSuite抓包工具概述设置代理信息抓包的基本操作抓HTTPS包的证书设置BurpSuite安装介绍BurpSuite是一款集成化的渗透测试工具,包含了许多功能,可以帮助我们高效地完成对web应用程序的渗透测试和攻击。由Java语言编写,执行程序是Java文件类型的jar文件,免费版可在官网下载。环境运行时依赖JRE,需提前安装Java环境。百度JDK下载即可。(打开cmd,输入Java-version,便可查看版本信息)环境变量配置

  • 谷歌浏览器驱动国内镜像下载地址[通俗易懂]

    谷歌浏览器驱动国内镜像下载地址[通俗易懂]谷歌驱动(driverchrome.exe)国内镜像下载地址:http://npm.taobao.org/mirrors/chromedriver/Windows、Linux、MAC系统均可下载下载解压,放到C:\ProgramFiles(x86)\Google\Chrome\Application(自己的谷歌浏览器安装路径)下即可…

  • c#操作数据库(winform如何修改数据库设置)

    鉴于很多童鞋们对数据库操作不是很熟悉,这里对数据库操作的相关知识做个介绍。首先介绍ADO.NET中的几个常用的对象,介绍的很简单。1.SqlConnection 这是数据库连接对象,通过对其进行实例化来创建针对数据库的连接,其参数为数据库连接字符串。如下:S

  • mac OCR截图文字识别工具—iText for mac[通俗易懂]

    mac OCR截图文字识别工具—iText for mac[通俗易懂]iTextformac中文版是Macos系统上一款从图片中识别文字的OCR(光学字符识别)工具。通过截图、拖拽图片,即可以从扫描版的PDF等任意图片中识字,并且可以很好的解决摘抄和批注需求。帮助用户识别图片中文字,节约时间,提高效率。iTextformac下载安装教程…

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号