Android 6.0权限申请详解及权限资料整理
作者:DontLazy 发布时间:2023-12-05 16:55:07
在android 6.0开始,部分的权限需要我们动态申请,也就是说当我们的打开app的时候系统不会主动像您申请app所需要的部分权限,需要客户在使用app的时候主动的去申请。
一、权限的申请两步骤:
1、权限申请:
/**
* @param permissions需要申请的权限
* @param requestCode申请回调code
*/
public static void requestPermissions(final @NonNull Activity activity,final @NonNullString[] permissions, final int requestCode)
2、申请回调处理:
/**
*@param requestCode申请回调code
*@param permissions申请的权限
*@param grantResults返回申请状态PackageManager#PERMISSION_GRANTED(授予) PackageManager#PERMISSION_DENIED(拒绝)
*/
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults)
二、Fragment中运行时权限的特殊处理
在Fragment中申请权限,不要使用ActivityCompat.requestPermissions, 直接使用Fragment的requestPermissions方法,否则会回调到Activity的onRequestPermissionsResult如果在Fragment中嵌套Fragment,在子Fragment中使用requestPermissions方 法,onRequestPermissionsResult不会回调回来,建议使用 getParentFragment().requestPermissions方法,
这个方法会回调到父Fragment中的onRequestPermissionsResult,加入以下代码可以把回调透传到子Fragment
@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
List fragments = getChildFragmentManager().getFragments();
if (fragments != null) {
for (Fragment fragment : fragments) {
if (fragment != null) {
fragment.onRequestPermissionsResult(requestCode,permissions,grantResults);
}
}
}
}
三、权限申请的简单封装
public class RequestPermissions {
public static intREQUEST_EXTERNAL_STORAGE = 1;
public static String[]PERMISSIONS_STORAGE = {
Manifest.permission.READ_EXTERNAL_STORAGE,
Manifest.permission.WRITE_EXTERNAL_STORAGE
};
/**
*读写权限申请回调true有权限false无权限
*
* @param mContext
*/
public static voidwriteExternalStorage(final Context mContext, PermissionCallBack mCallBack) {
//检查是否拥有相应的权限
int permission =ActivityCompat.checkSelfPermission(mContext,Manifest.permission.WRITE_EXTERNAL_STORAGE);
//没有权限发起申请
if (permission !=PackageManager.PERMISSION_GRANTED) {
//6.0及以上版本才需要申请权限
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.M)
ActivityCompat.requestPermissions((Activity) mContext,PERMISSIONS_STORAGE,REQUEST_EXTERNAL_STORAGE);
else {
mCallBack.setOnPermissionListener(false);
}
} else {
mCallBack.setOnPermissionListener(true);
}
}
/**
*读写权限申请回调true有权限false无权限
*
* @param mContext
*/
public static voidwriteExternalStorage(final Context mContext, PermissionCallBack mCallBack, intrequestCode) {
//检查是否拥有相应的权限
int permission =ActivityCompat.checkSelfPermission(mContext,Manifest.permission.WRITE_EXTERNAL_STORAGE);
//没有权限发起申请
if (permission !=PackageManager.PERMISSION_GRANTED) {
//6.0及以上版本才需要申请权限
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.M)
ActivityCompat.requestPermissions((Activity) mContext,PERMISSIONS_STORAGE,requestCode);
else {
mCallBack.setOnPermissionListener(false);
}
} else {
mCallBack.setOnPermissionListener(true);
}
}
/**
*权限申请回调,需要在你调用的Activity中onRequestPermissionsResult调用该方法true申请权限成功false申请权限失败
*
* @param requestCode
* @param permissions
* @param grantResults
*/
public static void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions,@NonNull int[] grantResults, PermissionCallBack mCallBack) {
if (requestCode ==REQUEST_EXTERNAL_STORAGE) {
//判断权限是否申请成功
if(grantResults.length > 0 && grantResults[0] ==PackageManager.PERMISSION_GRANTED) {
mCallBack.setOnPermissionListener(true);
} else {
mCallBack.setOnPermissionListener(false);
}
return;
}
}
/**
* 6.0以下申请打开权限管理
*
* @param mContext
*/
public static void openPre(final Context mContext) {
RemindDialogUtil.showRemindDialog(mContext, "當前無權限,將無法進行應用升級~,是否打开设置?", new RemindDialogUtil.DialogCallBack() {
@Override
public void clickYes() {
//跳转到设置页面,手动打开权限
Intent intent= new Intent();
intent.setAction(Settings.ACTION_APPLICATION_SETTINGS);
mContext.startActivity(intent);
RemindDialogUtil.hideRemindDialog();
}
@Override
public voidclickCancel() {
RemindDialogUtil.hideRemindDialog();
}
});
}
public interfacePermissionCallBack {
void setOnPermissionListener(Boolean bo);
}
}
附录
以下权限都需要在运行时判断:
身体传感器
日历
摄像头
通讯录
地理位置
麦克风
电话
短信
存储空间
以下权限只需要在AndroidManifest.xml中声明即可使用
android.permission.ACCESS_LOCATION_EXTRA_COMMANDS
android.permission.ACCESS_NETWORK_STATE
android.permission.ACCESS_NOTIFICATION_POLICY
android.permission.ACCESS_WIFI_STATE
android.permission.ACCESS_WIMAX_STATE
android.permission.BLUETOOTH
android.permission.BLUETOOTH_ADMIN
android.permission.BROADCAST_STICKY
android.permission.CHANGE_NETWORK_STATE
android.permission.CHANGE_WIFI_MULTICAST_STATE
android.permission.CHANGE_WIFI_STATE
android.permission.CHANGE_WIMAX_STATE
android.permission.DISABLE_KEYGUARD
android.permission.EXPAND_STATUS_BAR
android.permission.FLASHLIGHT
android.permission.GET_ACCOUNTS
android.permission.GET_PACKAGE_SIZE
android.permission.INTERNET
android.permission.KILL_BACKGROUND_PROCESSES
android.permission.MODIFY_AUDIO_SETTINGS
android.permission.NFC
android.permission.READ_SYNC_SETTINGS
android.permission.READ_SYNC_STATS
android.permission.RECEIVE_BOOT_COMPLETED
android.permission.REORDER_TASKS
android.permission.REQUEST_INSTALL_PACKAGES
android.permission.SET_TIME_ZONE
android.permission.SET_WALLPAPER
android.permission.SET_WALLPAPER_HINTS
android.permission.SUBSCRIBED_FEEDS_READ
android.permission.TRANSMIT_IR
android.permission.USE_FINGERPRINT
android.permission.VIBRATE
android.permission.WAKE_LOCK
android.permission.WRITE_SYNC_SETTINGS
com.android.alarm.permission.SET_ALARM
com.android.launcher.permission.INSTALL_SHORTCUT
com.android.launcher.permission.UNINSTALL_SHORTCUT
感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!
来源:http://www.jianshu.com/p/db1d0e7908a6
猜你喜欢
- 定义装饰者模式:在不改变原有对象的基础之上,动态的将功能附加到对象上,提供了继承更有弹性的替代方案,也体现了开闭原则案例需求一个人去咖啡店点
- 目录1、如果一个方法或变量是"private"访问级别,那么它的访问范围是:2、代码将打印?3、下面关于hibernat
- 前言我们在日常的开发中有时候会遇到需要用到相机的需求,而相机也是很常用的东西,例如扫二维码啊拍照上传啊等等。这里我不讲像qq那样自定义很强的
- 前言Spring Boot集成Redis实现单机分布式锁针对单机分布式锁还是存在锁定续期、可重入的问题,本文将采用Spring Boot 集
- 这篇文章主要介绍了SpringBoot下如何实现支付宝接口的使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值
- 目录猜测可能原因问题排查问题原因总结class Main { public static void main(St
- 0. 前言在上一篇中,我故意留下了查询的示范没讲。虽然说可以通过以下代码获取一个DataReader:IDataReader reader
- 使用Spring3 实现用户登录以及权限认证这里我就简单介绍一下,我在实现的时候处理的一些主要的实现。1.用户登录 <form act
- 使用Spring data JPA开发已经有一段时间了,这期间学习了一些东西,也遇到了一些问题,在这里和大家分享一下。前言:Spring d
- 本文实例讲述了Java实现的计算最大下标距离算法。分享给大家供大家参考,具体如下:题目描述给定一个整形数组,找出最大下标距离j−i, 当且A
- 1.把springboot项目打包成三个jar包,并指定端口为14341,14342,143432.下载腾讯云免费ssl证书,解压后会出现如
- 本文实例为大家分享了Java使用开源Rxtx实现串口通讯的具体代码,供大家参考,具体内容如下使用方法:windows平台:1、把rxtxPa
- 基本的 Java 类型(boolean、byte、char、short、int、long、float 和 double)和关键字 void通
- 本文实例讲述了C#实现利用泛型将DataSet转为Model的方法。分享给大家供大家参考。具体如下:因为网站需要用C#开发,习惯了java的
- 看到当上面的对话框弹出时,可以使用命令查看顶层的活动窗口adb shell dumpsys window | findstr mCurren
- 正好用到。mark一下背景org.springframework.beans及org.springframework.context这两个包
- 背景ELMAH就是一个日志的拦截和处理组件,说到.net的日志组件,大家的第一反应该是Log4Net、NLog等这些东西,关于Log4Net
- 本文以C#和vb.net代码示例展示如何来获取Excel工作表中图片的坐标位置。这里的坐标位置是指图片左上角顶点所在的单元格行和列位置,横坐
- 计数排序是非比较的排序算法,用辅助数组对数组中出现的数字计数,元素转下标,下标转元素计数排序优缺点优点:快缺点:数据范围很大,比较稀疏,会导
- 什么是优雅停机先来一段简单的代码,如下:@RestControllerpublic class DemoController { @GetM