美文网首页
安卓静默安装、卸载APK kotlin

安卓静默安装、卸载APK kotlin

作者: 奈蜇 | 来源:发表于2024-04-22 16:15 被阅读0次

应用要求:sdk>21、系统签名、android:sharedUserId="android.uid.system"

代码

//静默安装
    private const val ACTION_INSTALL = "com.huopai.ACTION_INSTALL"
    private suspend fun silentInstall(context: Context, apkPath: String): Boolean {
        try {
            return withContext(Dispatchers.IO) {
                val file = File(apkPath)
                if (file.isFile) {
                    val packageManager = context.packageManager
                    val packageInstaller = packageManager.packageInstaller
                    val sessionParams = PackageInstaller.SessionParams(PackageInstaller.SessionParams.MODE_FULL_INSTALL)
                    val sessionId = packageInstaller.createSession(sessionParams)
                    val session = packageInstaller.openSession(sessionId)
                    val outputStream = session.openWrite("PackageInstaller", 0, file.length())
                    val inputStream = FileInputStream(file)
                    inputStream.copyTo(outputStream)
                    session.fsync(outputStream)
                    //关闭流
                    outputStream.close()
                    inputStream.close()
                    //监听结果
                    val deferredResult = CompletableDeferred<Int>()
                    val receiver = object : BroadcastReceiver() {
                        override fun onReceive(context: Context, intent: Intent) {
                            XLog.d("收到广播 $intent")
                            val status: Int = intent.extras?.getInt(PackageInstaller.EXTRA_STATUS, -1) ?: -1
                            //异步拿结果
                            deferredResult.complete(status)
                        }
                    }
                    //注册广播
                    val intentFilter = IntentFilter()
                    intentFilter.addAction(ACTION_INSTALL)
                    ContextCompat.registerReceiver(context, receiver, intentFilter, ContextCompat.RECEIVER_NOT_EXPORTED)
                    //提交安装
                    val intent = Intent(ACTION_INSTALL)
                    val pendingIntent = PendingIntent.getBroadcast(context, sessionId, intent, PendingIntent.FLAG_UPDATE_CURRENT)
                    session.commit(pendingIntent.intentSender)
                    //等待安装结果
                    val result = withTimeoutOrNull(10000) {
                        deferredResult.await()
                    }
                    //反注册
                    context.unregisterReceiver(receiver)
                    return@withContext if (result == null) {
                        //超时  一般这里需要释放任务(已反注册)
                        false
                    } else {
                        result == PackageInstaller.STATUS_SUCCESS
                    }
                }
                false
            }
        } catch (e: Exception) {
            e.printStackTrace()
        }
        return false
    }

卸载apk

//静默卸载APK
    private const val ACTION_UNINSTALL = "com.huopai.ACTION_UNINSTALL"
    suspend fun silentUninstallApk(context: Context, packageName: String): Boolean {
        try {
            val deferredResult = CompletableDeferred<Int>()
            val receiver = object : BroadcastReceiver() {
                override fun onReceive(context: Context, intent: Intent) {
                    XLog.d("收到广播 $intent")
                    val status: Int = intent.extras?.getInt(PackageInstaller.EXTRA_STATUS, -1) ?: -1
                    //异步拿结果
                    deferredResult.complete(status)
                }
            }
            //注册广播
            val intentFilter = IntentFilter()
            intentFilter.addAction(ACTION_UNINSTALL)
            ContextCompat.registerReceiver(context, receiver, intentFilter, ContextCompat.RECEIVER_NOT_EXPORTED)
            //开始卸载
            val intent = Intent(ACTION_UNINSTALL)
            val pendingIntent = PendingIntent.getBroadcast(context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT)
            val packageInstaller = context.packageManager.packageInstaller
            packageInstaller.uninstall(packageName, pendingIntent.intentSender)
            //等待卸载结果
            val result = withTimeoutOrNull(6000) {
                deferredResult.await()
            }
            //反注册
            context.unregisterReceiver(receiver)
            return if (result == null) {
                //超时  一般这里需要释放任务(已反注册)
                false
            } else {
                result == PackageInstaller.STATUS_SUCCESS
            }
        } catch (e: Exception) {
            e.printStackTrace()
        }
        return false
    }

相关文章

  • adb实用命令

    截屏: windows批处理命令: linux(MAC)命令: 安装APK: 卸载apk: 清理app缓存: 安卓...

  • Android APK 反编译实践

    apk是安卓工程打包的最终形式,将apk安装到手机或者模拟器上就可以使用APP。反编译apk则是将该安卓工程的源码...

  • 安卓静默安装

    好多公司有静默安装的需求(就是不用人去确认就把程序更新了)目前主流的技术有无障碍模式、辅助程序加pm命令模式、系统...

  • APK逆向工程

    APK APK(android Application PacKage)文件是安卓app的安装文件,其实就是一个z...

  • 用十种编程语言开发秒表应用-第一篇-安卓

    用十种编程语言开发秒表应用 安卓Kotlin (安卓App) 安卓Kotlin+JetPack Compose(安...

  • [Android] 代码安装和卸载APK

    APK 的安装 APK 的卸载 源码: GitHub: InstallApkDemo

  • 锁软件的更新指南

    1.在安卓手机上安装BlueXBleOta的apk 在微信上收到apk可能无法直接点击安装(有些手机可以,这里以华...

  • flutter 安卓打包

    flutter 安卓打包 - 简书 Flutter项目打包成安卓apk详解来了(解决安装没网络问题) - 「dt猫」

  • DAY25

    安卓模拟器 安卓模拟器是能在电脑上模拟安卓操作系统,并能安装、使用、卸载安卓应用的软件,它能让你在电脑上也能体验操...

  • 安卓客户端如何实现ppt和pdf转成H5?

    1、建议使用浏览器下载安卓客户端http://file.yl1001.com/apk/files.apk 2、安装...

网友评论

      本文标题:安卓静默安装、卸载APK kotlin

      本文链接:https://www.haomeiwen.com/subject/zzxixjtx.html