未从 PackageInstaller 获取状态更新

问题描述 投票:0回答:1

我正在尝试使用 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"/>

我不确定我做错了什么,我看过的使用包管理器的所有示例似乎都在做我正在做的事情

android android-package-managers packageinstaller
1个回答
0
投票

问题是待定意图标志

PendingIntent.FLAG_IMMUTABLE
它需要是
PendingIntent.FLAG_MUTABLE
才能出现额外内容

© www.soinside.com 2019 - 2024. All rights reserved.