android - PackageInstaller 返回 INSTALL_FAILED_INTERNAL_ERROR:权限被拒绝
问题描述
我有一个具有设备所有者权限的应用程序,我正在尝试静默安装另一个应用程序。我为此使用 PackageInstaller API 和我的资产文件夹中的 apk 文件。它运行良好,但返回一个带有 STATUS_FAILURE 和消息 INSTALL_FAILED_INTERNAL_ERROR: Permission Denied 的意图。
我按照这个答案编写了我的 AppInstaller 类:
class AppInstaller {
companion object {
const val ACTION_INSTALL_COMPLETE = "my.package.name.INSTALL_COMPLETE"
}
@Throws(IOException::class)
fun installPackage(context: Context, fileName: String, packageName: String): Boolean {
val input = context.assets.open(fileName)
val packageInstaller = context.packageManager.packageInstaller
val params = PackageInstaller.SessionParams(PackageInstaller.SessionParams.MODE_FULL_INSTALL)
params.setAppPackageName(packageName)
// set params
val sessionId = packageInstaller.createSession(params)
val session = packageInstaller.openSession(sessionId)
val out = session.openWrite("DPC", 0, -1)
val buffer = ByteArray(65536)
var c = input.read(buffer)
while (c != -1) {
out.write(buffer, 0, c)
c = input.read(buffer)
}
session.fsync(out)
input.close()
out.close()
session.commit(createIntentSender(context, sessionId))
return true
}
private fun createIntentSender(context: Context, sessionId: Int): IntentSender {
val pendingIntent = PendingIntent.getBroadcast(context, sessionId, Intent(ACTION_INSTALL_COMPLETE), 0)
return pendingIntent.intentSender
}
}
我尝试了有和没有这些权限:
<uses-permission android:name="android.permission.INSTALL_PACKAGES" tools:ignore="ProtectedPermissions"/>
<uses-permission android:name="android.permission.DELETE_PACKAGES" tools:ignore="ProtectedPermissions"/>
<uses-permission android:name="android.permission.REQUEST_DELETE_PACKAGES"/>
<uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES"/>
这段代码的结果是真的
dpm.isDeviceOwnerApp("my.package.name")
通过这个 aosp 代码和android 文档中的描述:
提交可能需要用户干预才能完成安装,除非调用者属于以下类别之一,在这种情况下,安装将自动完成。
设备所有者
附属的个人资料所有者
设备所有者使用 DevicePolicyManager.DELEGATION_PACKAGE_INSTALLATION 委托应用程序
会话可以安装全新的应用程序、升级现有应用程序或将新拆分添加到现有应用程序中。
所以我应该有权限。
任何想法为什么我会收到此错误?谢谢。
解决方案
推荐阅读
- docker-for-windows - 如何保持 Windows 容器运行?
- c - 如果输入是单个 1 或 0 以及所需的输出,则代码输出大写“D”
- java - 精简模式下的 MapView 导致 RecyclerView 无法正确滚动
- java - 使用 Mockito 将方面服务调用一般断言到较低层
- typescript - 给定一个方法签名的元组,是否可以推断出一个新的元组类型,其值是原始元组方法的返回值?
- matlab - 如何使用 n 个方程 n 个未知数从模糊图像中计算真实像素颜色?
- python - 最后获取 CrossValidation 拆分报告
- java - Android Studio 找不到资源和资源链接失败
- python - 如何将 mmap.mmap Python 对象转换为字符串?
- python - 如何为此机器学习模型设置 request.py?