Android Apk安装(兼容Android11 Api30)
2020-08-26 本文已影响0人
小白cz
Apk安装
Android11之前可通过 Intent.ACTION_INSTALL_PACKAGE 进行传递Apk的URI进行安装
但是在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)
}
}
}
}
}