随着Android版本的不断升级,短信权限管理越来越严格,开发者需要在开发Android应用的过程中注意对短信权限的适配。本文将介绍如何在Android 9.0上适配短信权限。
1. 短信权限简介
在Android系统中,短信权限是需要动态申请的权限之一。如果应用需要在用户的手机上读取或发送短信,必须获取到短信权限。在Android 6.0之前,短信权限被包含在了“电话”权限中,只要申请了该权限,应用就可以读取或发送短信。但是从Android 6.0开始,短信权限被拆分出来,必须单独申请。
2. Android 9.0对短信权限的变化
在Android 9.0中,Google进一步加强了对短信权限的管理,主要有以下几个变化:
(1)对短信的限制更加严格
Android 9.0限制了应用对用户的所有短信的访问权限,只有用户选择将某个应用设为短信应用程序,才能访问用户的所有短信。其他应用只能访问用户回复或创建的短信。
(2)限制部分非系统应用读取用户的短信
除了设为短信应用程序的应用,其他非系统应用只能读取其自己创建或用户回复的短信。这就使得一些垃圾信息过滤器、备份应用、智能短信等应用受到了影响。
3. 如何在Android 9.0上适配短信权限
(1)申请短信权限
首先我们需要在Manifest.xml文件中声明需要使用短信权限:
```xml
```
然后在代码中动态申请短信权限,如下所示:
```java
if (ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.READ_SMS)
!= PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(MainActivity.this,
new String[]{Manifest.permission.READ_SMS},
MY_PERMISSIONS_REQUEST_READ_SMS);
}
```
此时,用户会看到一个弹窗,询问是否授权应用读取短信。
(2)设为短信应用程序
在Android 9.0上,开发者需要动态地设置应用为短信应用程序。只有设为短信应用程序,应用才有权访问用户的所有短信。
要让应用成为短信应用程序,需要在代码中设置,如下所示:
```java
if (SmsManager.getDefault().getSubscriptionId() == SubscriptionManager.INVALID_SUBSCRIPTION_ID) {
ComponentName componentName = new ComponentName(MainActivity.this, SmsReceiver.class);
getPackageManager().setComponentEnabledSetting(
componentName,
PackageManager.COMPONENT_ENABLED_STATE_ENABLED,
PackageManager.DONT_KILL_APP);
Intent intent = new Intent(Telephony.Sms.Intents.ACTION_CHANGE_DEFAULT).putExtra(Telephony.Sms.Intents.EXTRA_PACKAGE_NAME, getPackageName());
startActivity(intent);
}
```
该代码将该应用的包名传入到设置默认短信应用程序的Intent中,启动该Intent后,系统会弹出一个提示框,询问用户是否将该应用设为默认的短信应用程序。
总结
通过上述介绍可以看出,在Android 9.0上适配短信权限相对于之前的版本更加严格,开发者需要在代码中设置为短信应用程序,才能访问到用户的短信。当然,这也增加了用户的隐私保护,让应用不能随意访问用户的短信,这也是在Android开发中需要非常注意的问题之一。