静默安装第三方app

375 阅读1分钟

android 10上静默安装 第三方app的 kotlin 方法

在Android 10及以上版本中,由于安全原因,应用程序不能在未经用户许可的情况下进行静默安装。但是,您可以使用以下Kotlin代码请求用户授予您的应用程序安装权限并执行安装操作:

首先,在AndroidManifest.xml文件中添加以下权限:

<uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES" />

然后,在您的Kotlin类中,您可以使用以下代码请求安装权限和执行应用程序安装:

val packageInstaller = packageManager.packageInstaller

val intent = Intent(Intent.ACTION_VIEW).apply {
    data = Uri.fromFile(apkFile)
    flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_GRANT_READ_URI_PERMISSION
}

val sessionParams = PackageInstaller.SessionParams(PackageInstaller.SessionParams.MODE_FULL_INSTALL)

val sessionId = packageInstaller.createSession(sessionParams)
val session = packageInstaller.openSession(sessionId)

session.openWrite(packageName, 0, -1).use { output ->
    FileInputStream(apkFile).use { input ->
        input.copyTo(output)
    }
}

val pendingIntent = PendingIntent.getBroadcast(
    applicationContext,
    sessionId,
    Intent(applicationContext, InstallReceiver::class.java),
    0
)

session.commit(pendingIntent.intentSender)

这个代码的关键点:

  • packageManager.packageInstaller - 获取PackageInstaller实例。
  • Intent.FLAG_GRANT_READ_URI_PERMISSION - 授予读取URI的权限。
  • PackageInstaller.SessionParams.MODE_FULL_INSTALL - 安装完整的应用程序。
  • sessionParams - 创建一个SessionParams对象。
  • sessionParams.setAppPackageName(packageName) - 将应用程序包名称设置为会话参数。
  • sessionParams.installReason = PackageInstaller.SessionParams.installReasonUser - 将安装原因设置为用户。
  • packageInstaller.createSession(sessionParams) - 创建安装会话。
  • session.openWrite(packageName, 0, -1) - 打开一个输出流以写入应用程序包。
  • Intent(applicationContext, InstallReceiver::class.java) - 指定安装完成后的广播接收器。
  • session.commit(pendingIntent.intentSender) - 安装应用程序。

还需要创建一个广播接收器来接收安装完成的广播:

class InstallReceiver : BroadcastReceiver() {
    override fun onReceive(context: Context, intent: Intent) {
        val status = intent.getIntExtra(PackageInstaller.EXTRA_STATUS, PackageInstaller.STATUS_FAILURE)
        if (status == PackageInstaller.STATUS_SUCCESS) {
            // 安装成功
        } else {
            // 安装失败
        }
    }
}

请注意,如果您的应用程序没有相应的权限,您需要先请求这些权限。您可以使用以下代码请求REQUEST_INSTALL_PACKAGES权限:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O && !packageManager.canRequestPackageInstalls()) {
    val intent = Intent(Settings.ACTION_MANAGE_UNKNOWN_APP_SOURCES)
    intent.data = Uri.parse("package:$packageName")
    startActivity(intent)
} else {
    // 已经具有安装权限
}