相信大家都知道,在Android 13上,谷歌已经严格限制辅助功能了(Accessibility)的使用,将不允许从未经验证的外部来源APP使用Accessibility API。这项新限制将不允许用户在这类应用受到限制时,手动启用特定应用的访问权限,如果用户仍选择授予这一权限,系统则将会显示一条错误消息,并提示 “为了您的安全,此设置当前不可用”。
那么,如何让自己的应用在Android 13上也能继续使用辅助功能呢,由于项目也需要辅助功能,我也已经在去年9月份就遇到了这个问题并总结了解决方法,今天就和大家分享一下
首先我们需要认识包安装器PackageInstaller,具体的介绍可以看谷歌的文档或者其他大佬的文章,这里我只简单介绍一下,它是用于在app内安装其他应用的一个系统服务,并且通过packageInstaller安装的应用不受Android13开启辅助功能的限制,所以我们可以将自己的应用套在一个专门用于安装我们应用的APP里,用户下载这个安装器之后再通过安装器安装我们真正需要辅助功能的APP,以此绕开辅助功能开启限制,具体代码如下:
val installer = context.packageManager.packageInstaller
val params = PackageInstaller.SessionParams(
PackageInstaller.SessionParams.MODE_FULL_INSTALL
)
val session = withContext(Dispatchers.IO) {
installer.openSession(installer.createSession(params)).also {
it.openWrite("package", 0, -1).use { packageInSession ->
FileInputStream(file).use { inputStream ->
val buffer = ByteArray(4096)
var n: Int
while (inputStream.read(buffer).also { n = it } >= 0) {
packageInSession.write(buffer, 0, n)
}
}
}
}
}
val flag = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {
PendingIntent.FLAG_MUTABLE
} else {
0
}
val sender = PendingIntent
.getBroadcast(context, 0, Intent(**ACTION**), flag)
.intentSender
session.commit(sender)
其中的ACTION用于指定PackageInstaller在安装过程中发送安装状态的Action,如果想监听安装的状态,需要注册一个监听ACTION的广播接收器,广播回调的intent.action代表用户当前状态, 重要的广播有
- PackageInstaller.STATUS_PENDING_USER_ACTION,表示当前接下来需要等待用户操作
- PackageInstaller.STATUS_SUCCESS,表示安装成功
- PackageInstaller.STATUS_FAILURE,表示安装失败
用户安装成功之后,再指引用户去辅助功能页打开我们APP的辅助功能,这时候就会发现打开成功了