【发布时间】:2018-07-27 17:34:06
【问题描述】:
查看 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
有人知道这里出了什么问题吗?
【问题讨论】:
-
查看
PackageInstallerService的来源,它会在系统启动时获取对mContext.getSystemService(AppOpsManager.class)的引用。但在你的情况下它是空的。你说你有系统签名。您是否正在构建自定义 ROM?您是否删除/禁用了应用程序操作服务?在您尝试安装时系统是否已完全准备好?这是什么版本的安卓?
标签: android kotlin android-source android-package-managers silent-installer