我正在尝试使用 PackageInstaller 来安装 apk,当我将会话提交到包安装以开始安装过程时,我的广播接收器会获取操作,但状态、包名称、状态消息、会话 id 的任何额外信息都不在意图
这是我创建会话的方法
override suspend fun installUpdates(): Unit = withContext(Dispatchers.IO) {
try {
apkDirectory.listFiles()?.forEach { apk ->
val params = PackageInstaller.SessionParams(PackageInstaller.SessionParams.MODE_FULL_INSTALL)
val sessionId = context.packageManager.packageInstaller.createSession(params)
val session = context.packageManager.packageInstaller.openSession(sessionId)
apk.inputStream().use { apkStream ->
session.openWrite(apk.nameWithoutExtension, 0, apk.length()).use { sessionStream ->
apkStream.copyTo(sessionStream)
session.fsync(sessionStream)
}
}
val intent = Intent(context, InstallReceiver::class.java)
intent.action = InstallReceiver.ACTION_INSTALL
val pi = PendingIntent.getBroadcast(
context,
InstallReceiver::class.hashCode(),
intent,
PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_IMMUTABLE
)
session.commit(pi.intentSender)
session.close()
}
} catch (e: Exception) {
e.printStackTrace()
}
}
这是我的广播接收器
<receiver android:name=".shared.updater.InstallReceiver"
android:exported="false">
<intent-filter>
<action android:name="xx.xx.installer.InstallReceiver.ACTION_INSTALL" />
</intent-filter>
</receiver>
代码
override fun onReceive(context: Context, intent: Intent) {
if(intent.action == ACTION_INSTALL){
val status = intent.getIntExtra(PackageInstaller.EXTRA_STATUS, -2)
val message: String? = intent.getStringExtra(PackageInstaller.EXTRA_STATUS_MESSAGE)
val pname = intent.getStringExtra(PackageInstaller.EXTRA_PACKAGE_NAME)
val sessionId = intent.getIntExtra(PackageInstaller.EXTRA_SESSION_ID, 0)
val sessionInfo: SessionInfo? = intent.getParcelableExtra(PackageInstaller.EXTRA_SESSION)
Log.d(TAG, "Status: $status, Message: $message, Package Name: $pname, Session ID: $sessionId")
when (status) {
PackageInstaller.STATUS_PENDING_USER_ACTION -> {
// This test app isn't privileged, so the user has to confirm the install.
Log.d(TAG, "Install needs user interaction")
}
PackageInstaller.STATUS_SUCCESS -> {
Log.d(TAG, "Installed successfully")
}
PackageInstaller.STATUS_FAILURE,
PackageInstaller.STATUS_FAILURE_ABORTED,
PackageInstaller.STATUS_FAILURE_BLOCKED,
PackageInstaller.STATUS_FAILURE_CONFLICT,
PackageInstaller.STATUS_FAILURE_INCOMPATIBLE,
PackageInstaller.STATUS_FAILURE_INVALID,
PackageInstaller.STATUS_FAILURE_STORAGE,
PackageInstaller.STATUS_FAILURE_TIMEOUT -> {
val message: String? = intent.getStringExtra(PackageInstaller.EXTRA_STATUS_MESSAGE)
Log.d(TAG, "Install failure, Status: $status, Message: $message")
}
else -> {
//Unknown status
Log.d(TAG, "Unknown install status $status")
}
}
}else{
Log.d(TAG, "Unknown action ${intent.action}")
}
}
}
所有额外的内容都以默认值或 null 的形式返回,但 apk 确实安装正确。
我也有安装包权限(应用程序已复制到 root 设备上的 system/priv-app 文件夹)
<uses-permission android:name="android.permission.INSTALL_PACKAGES"/>
我不确定我做错了什么,我看过的使用包管理器的所有示例似乎都在做我正在做的事情
问题是待定意图标志
PendingIntent.FLAG_IMMUTABLE
它需要是 PendingIntent.FLAG_MUTABLE
才能出现额外内容