android apk能直接安装,Android Apk安装(兼容Android11 Api30)

Apk安装

Android11之前可通过 Intent.ACTION_INSTALL_PACKAGE 进行传递Apk的URI进行安装

但是在Android11版本 Intent.ACTION_INSTALL_PACKAGE 已标注弃用

同时推荐在Android5版本提供的PackageInstaller类进行安装

兼容到Android5.0

PackageInstaller

先看看该类的使用流程

e42f9973aea2

Android Apk 安装.jpg

额外提示

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

代码实现

注意 该类启动模式为 栈顶单例

同时需配备一个 intent-filter

//注意 该类启动模式为 栈顶单例

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)

}

}

}

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值