Android Apk安装(兼容Android11 Api30)

2020-08-26  本文已影响0人  小白cz

Apk安装

Android11之前可通过 Intent.ACTION_INSTALL_PACKAGE 进行传递ApkURI进行安装
但是在Android11版本 Intent.ACTION_INSTALL_PACKAGE 已标注弃用
同时推荐在Android5版本提供的PackageInstaller类进行安装

兼容到Android5.0

PackageInstaller

先看看该类的使用流程


Android Apk 安装.jpg

额外提示

通过该方式,不需要主动去申请App内安装Apk权限,PackageInstaller内置了该申请

代码实现

注意 该类启动模式为 栈顶单例
同时需配备一个 intent-filter

<activity android:name=".InstallActivity" android:launchMode="singleTop">
    <intent-filter>
        <action android:name="cc.xiaobaicz.work.INSTALL_APK" android:exported="true"/>
    </intent-filter>
</activity>
//注意 该类启动模式为 栈顶单例
class InstallActivity : AppCompatActivity() {
    
    //intent-filter 的 action
    private val ACTION_INSTALL = "cc.xiaobaicz.work.INSTALL_APK"

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        install()
    }

    /**
     * 安装
     */
    private fun install() {
        packageManager.packageInstaller.apply {
            //生成参数
            val params = PackageInstaller.SessionParams(PackageInstaller.SessionParams.MODE_FULL_INSTALL)
            //创建ID
            val id = createSession(params)
            //打开Session
            val session = openSession(id)
            //写入文件
            writeAssetsApk2Session(session, "pbox.apk")
            //新建IntentSender
            val intent = createIntentSender()
            //提交,进行安装
            session.commit(intent)
        }
    }

    /**
     * 新建一个IntentSender用于接收结果
     * 该例子通过当前页面接收
     */
    private fun createIntentSender(): IntentSender {
        val intent = Intent(this, MainActivity::class.java).apply {
            action = ACTION_INSTALL
        }
        val pending = PendingIntent.getActivity(this, 0, intent, 0)
        return pending.intentSender
    }

    //写入Apk到Session输出流,该例子 获取Assets内文件,可通过其他方式获取Apk流
    private fun writeAssetsApk2Session(session: PackageInstaller.Session, s: String) {
        assets.open(s).use { input ->
            session.openWrite("apk", 0, -1).use { output ->
                output.write(input.readBytes())
            }
        }
    }

    /**
     * 接收安装结果
     */
    override fun onNewIntent(intent: Intent?) {
        super.onNewIntent(intent)
        intent ?: return
        if (intent.action != ACTION_INSTALL) {
            return
        }
        intent.extras?.apply {
            when (this.getInt(PackageInstaller.EXTRA_STATUS)) {
                PackageInstaller.STATUS_PENDING_USER_ACTION -> {
                    //提示用户进行安装
                    startActivity(this.get(Intent.EXTRA_INTENT) as Intent)
                }
                PackageInstaller.STATUS_SUCCESS -> {
                    //安装成功
                }
                else -> {
                    //失败信息
                    val msg = this.getString(PackageInstaller.EXTRA_STATUS_MESSAGE)
                }
            }
        }
    }

}
上一篇下一篇

猜你喜欢

热点阅读