繁体   English   中英

Android package 安装程序静默失败

[英]Android package installer failed silently

我尝试使用 PackageInstaller 以编程方式安装 APK,但它没有任何错误地失败了。 session.commit() 执行没有任何错误并调用回调 Intent。 但是回调意图没有收到任何额外的东西。

 @Throws(IOException::class)
fun installPackage(context: Context, `in`: InputStream, packageName: String): Boolean {
    Log.i("install","installer called")
    Log.i("install","in iteration")
    val packageInstaller: PackageInstaller = context.getPackageManager().getPackageInstaller()
    val params = SessionParams(
        SessionParams.MODE_FULL_INSTALL
    )
    params.setAppPackageName(packageName)
    // set params
    val sessionId = packageInstaller.createSession(params)
    val session = packageInstaller.openSession(sessionId)

    Log.i("id",""+sessionId)

    addApkToInstallSession("india.apk",session);
 
    val intent =  Intent(context, InstallResultReceiver::class.java)
    intent.setAction("PACKAGE_INSTALLED")
    val pendingIntent = PendingIntent.getBroadcast(
        context,
        sessionId,
        intent,
        PendingIntent.FLAG_IMMUTABLE or PendingIntent.FLAG_UPDATE_CURRENT
    )
    Log.i("t",""+packageInstaller.getSessionInfo(sessionId).toString())
    try {
        session.commit(pendingIntent.intentSender)
    }catch(e:Exception){
        Log.i("",""+e.stackTrace)
    }

    Log.i("Down","install committed")
    return true
}

   @Throws(IOException::class)
    private fun addApkToInstallSession(assetName: String, session: PackageInstaller.Session) {
        session.openWrite("package", 0, -1).use { packageInSession ->
            assets.open(assetName).use { `is` ->
                val buffer = ByteArray(16384)
                var n: Int
                while (`is`.read(buffer).also { n = it } >= 0) {
                    packageInSession.write(buffer, 0, n)
                }
            }
        }
    }

您必须更改 PendingIntent.getBroadcast() 上的标志。 尝试以下操作:

var flags = 0
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {
    flags = PendingIntent.FLAG_MUTABLE
}
val pendingIntent = PendingIntent.getBroadcast(
    context,
    sessionId,
    intent,
    flags
)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM