android动态权限申请并告知权限申请的使用目的

随着工信部对APP的一系列整治,现在要求APP在申请相机、位置等敏感权限时需要向用户同步告知权限申请的使用目的。个大应用市场在APP上线审核中也会重点检查这项要求。

从Android 6.0开始,对于敏感权限的获取,APP需要调用系统提供的动态申请权限API, 默认下,系统只是简单弹出一个授权询问框,我们要展示使用说明就要自己实现了。

下面是效果图(中间部分就是系统的授权询问框,顶上的是权限使用目的叠加层):

我们使用okpermission库来实现这个效果,这个库需要appcompat,所以如果你的项目不使用appcompat的话仅供参考。

GitHub - cncomer/okpermission: android动态权限申请并以同时告知权限申请的使用目的

在根项目settings.gradle依赖项解析管理里添加JitPack仓库 
dependencyResolutionManagement {
	repositories {
		maven { url 'https://jitpack.io' }
	}
}
在项目build.gradle添加okpermission依赖项 
dependencies {
	implementation 'com.github.cncomer:okpermission:1.0.0'
}
动态申请权限
new PermissionLauncher()
        .with(this)  //this可以是androidx.fragment.app.Fragment或者androidx.fragment.app.FragmentActivity
        .granted(() -> {
            //所有权限都授权后回调此处
        })
        .denied((rejectPermissionList) -> {
            //有权限被拒绝回调此处
            //rejectPermissionList为被拒绝的权限列表
        })
        .request(权限, 显示的权限名称, 显示的权限使用目的);

可以一次请求多个权限,request的时候传入权限数组即可,比如

.request(new String[]{权限1,权限2}, 
new String[]{权限1名称,权限2名称}, 
new String[]{权限1使用目的,权限2使用目的});

也可以请求多个权限,但只显示一个总的权限名称和使用目的,比如蓝牙权限,在Android 10以前还需要同时申请位置权限才能正常使用,所以我们可以把这两个权限的使用目的合在一起显示。

.request(
new String[]{Manifest.permission.BLUETOOTH, Manifest.permission.BLUETOOTH_ADMIN, Manifest.permission.ACCESS_FINE_LOCATION}, 
new String[]{"蓝牙、位置信息授权提示"}, 
new String[]{"为了实现扫描、连接蓝牙设备,并与其相互传输数据,需要访问蓝牙相关权限。然而对于Android 10这些相对偏旧的系统,还必须访问位置相关权限。您如果拒绝开启,将无法使用上述功能。"});

 不需要显示权限目的说明,直接请求权限即可。

.request(权限);
//或者
.request(权限数组);

Android动态权限申请read_phone_state是指在Android应用程序运行时,向系统请求获取获取手机状态的权限。read_phone_state权限用于读取手机的状态信息,例如设备的电话状态、IMEI号码、手机号码等。 在Android 6.0(API级别23)及以上版本中,Google引入了动态权限申请机制,要求开发者在使用涉及到敏感权限的地方,必须在运行时向用户申请权限。这是为了增强用户对隐私信息的控制,并提高应用的安全性。 为了申请read_phone_state权限,开发者需要先在AndroidManifest.xml文件中声明以下权限: <uses-permission android:name="android.permission.READ_PHONE_STATE" /> 接下来,在应用中的合适位置,开发者需要编写相关代码来动态请求权限。以下是一个示例: // 检查应用是否已经获取了权限 if (ContextCompat.checkSelfPermission(this, Manifest.permission.READ_PHONE_STATE) != PackageManager.PERMISSION_GRANTED) { // 如果未获取权限,则向用户申请权限 ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.READ_PHONE_STATE}, MY_PERMISSIONS_REQUEST_READ_PHONE_STATE); } else { // 如果已经获取了权限,则执行相应的操作 // 例如,从手机状态中获取IMEI号码 TelephonyManager telephonyManager = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE); String imei = telephonyManager.getDeviceId(); } 在上述代码中,我们首先检查应用是否已经获取了read_phone_state权限,如果未获取权限,则向用户申请权限。如果已经获取了权限,我们可以执行获取手机状态信息的操作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值