Android - 使用 PackageInstaller 和 PackageInstaller.Session 静默安装 APK

2023-12-27

调查Android(AOSP)的来源,installPackage被标记为已弃用并检查 Android 的 PackageManager 应用程序,它使用PackageInstaller类来创建一个PackageInstaller.Session实例来执行 APK 的安装。

我正在尝试在我的应用程序中做同样的事情。我使用系统密钥进行签名,并且我确实包含了INSTALL_PACKAGES清单中的许可。

这是我的代码:

    val packageName = "com.spotify.music"
    val inputStream = File(filesDir, "spotify.apk").inputStream()

    // ...

    val packageInstaller = context.packageManager.packageInstaller
    val params = PackageInstaller.SessionParams(PackageInstaller.SessionParams.MODE_FULL_INSTALL)
    params.setAppPackageName(packageName)

    val sessionId = packageInstaller.createSession(params)
    val session = packageInstaller.openSession(sessionId)
    val out = session.openWrite("COSU", 0, -1)
    inputStream.copyTo(out)
    session.fsync(out)
    inputStream.close()
    out.close()
    session.commit(null)

但是,我收到以下奇怪的空指针异常:

Error while installing: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.app.AppOpsManager.checkPackage(int, java.lang.String)' on a null object reference

有人知道这里出了什么问题吗?


你无法通过null to session.commit()。请参阅文档安卓开发者 https://developer.android.com/reference/kotlin/android/content/pm/PackageInstaller.Session#commit。您需要的是一个 IntentSender,它是从 PendingIntent 中获取的,而 PendingIntent 又应该包含您的应用程序可以接收的意图(可以位于 Activity、Service 或 BroadcastReceiver 中)。

当会话提交时,结果将作为额外内容包含在收到的意图中。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Android - 使用 PackageInstaller 和 PackageInstaller.Session 静默安装 APK 的相关文章