Android 12通过软件包管理器破坏APK的安装? 您所在的位置:网站首页 mutable翻译 Android 12通过软件包管理器破坏APK的安装?

Android 12通过软件包管理器破坏APK的安装?

2023-05-27 18:26| 来源: 网络整理| 查看: 265

我正在为我的应用程序做一个更新,其中一部分涉及下载和安装APK文件。

只要之前的版本是针对SDK 30的,一切都运行得相当顺利。但是,当我将目标增量并将SDK编译到32时,它就开始表现得很奇怪。

下面是包管理器和安装处理的代码:

private fun installOnClickListener() { binding.termuxInstallCard.showProgress() var session: PackageInstaller.Session? = null try { val packageInstaller: PackageInstaller = requireContext().packageManager.packageInstaller val params = PackageInstaller.SessionParams( PackageInstaller.SessionParams.MODE_FULL_INSTALL ) val sessionId = packageInstaller.createSession(params) session = packageInstaller.openSession(sessionId) viewModel.addApkToSession(session) var installBroadcast: PendingIntent? = null val intent = Intent(PACKAGE_INSTALLED_ACTION).putExtra( "packageName", "com.termux" ) installBroadcast = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) { PendingIntent.getBroadcast( context, 0, intent, FLAG_MUTABLE ) } else { PendingIntent.getBroadcast(context, 0, intent, FLAG_UPDATE_CURRENT) } session.commit(installBroadcast.intentSender) session.close() } catch (e: IOException) { throw RuntimeException("Couldn't install package", e) } catch (e: RuntimeException) { session?.abandon() throw e } finally { session?.close() } }

下面是正在发生的事情:

由于我的目标是SDK 32,因此需要指定PendingIntent的PendingIntent可变性。

Targeting S+ (version 31 and above) requires that one of FLAG_IMMUTABLE or FLAG_MUTABLE be specified when creating a PendingIntent

当我使用:

标志_MUTABLE-安装只会失败,说明错误代码- STATUS_FAILURE_INVALID,没有额外的消息在EXTRA_STATUS_MESSAGE中进行调试。问题是,当我试图通过adb shell安装相同下载的APK时,它只是在没有任何issues.FLAG_IMMUTABLE-的情况下正常安装,安装成功而没有提示用户使用安装对话框,但实际上没有任何东西是installed.

如果你需要更多的代码-

fun addApkToInstallSession( path: String, session: PackageInstaller.Session ) { val file = File("${context.filesDir.path}/$path") val packageInSession: OutputStream = session.openWrite("com.termux", 0, -1) val inputStream = FileInputStream(file) val byteStream = inputStream.read() try { var c: Int val buffer = ByteArray(16384) while (inputStream.read(buffer).also { c = it } >= 0) { packageInSession.write(buffer, 0, c) } } catch (e: IOException) { println("IOEX") } finally { try { packageInSession.close() inputStream.close() } catch (e: IOException) { println("IOEX in closing the stream") } } }

private val broadcastReceiverForInstallEvents = object : BroadcastReceiver() { override fun onReceive(context: Context, intent: Intent) { lifecycleScope.launch(Dispatchers.IO) { val extras = intent.extras val status = extras!!.getInt(PackageInstaller.EXTRA_STATUS) val packageName = extras.getString("packageName")!! if (PACKAGE_INSTALLED_ACTION == intent.action) { println("STATUS $status") when (status) { PackageInstaller.STATUS_PENDING_USER_ACTION -> { try { val confirmIntent = extras[Intent.EXTRA_INTENT] as Intent confirmIntent.flags = Intent.FLAG_ACTIVITY_NEW_TASK context.startActivity(confirmIntent) } catch (e: Exception) { lifecycleScope.launch(Dispatchers.Main) { Toast.makeText( requireContext(), "We could not find an application to handle the installation of apps. Please download a package installer.", Toast.LENGTH_SHORT ).show() } } } PackageInstaller.STATUS_SUCCESS -> { lifecycleScope.launch(Dispatchers.Main) { println("$packageName Install succeeded!") // todo all done animation binding.termuxInstallCard.markAsComplete() Toast.makeText(requireContext(), "All Done!", Toast.LENGTH_SHORT) .show() lifecycleScope.launch { // viewModel.setTermuxSetupDone() } /* redirecting... */ Handler(Looper.getMainLooper()).postDelayed({ redirect() }, 2000) } } PackageInstaller.STATUS_FAILURE, PackageInstaller.STATUS_FAILURE_ABORTED, PackageInstaller.STATUS_FAILURE_BLOCKED, PackageInstaller.STATUS_FAILURE_CONFLICT, PackageInstaller.STATUS_FAILURE_INCOMPATIBLE, PackageInstaller.STATUS_FAILURE_INVALID, PackageInstaller.STATUS_FAILURE_STORAGE -> { lifecycleScope.launch(Dispatchers.Main) { println("Extra Status Message${extras.getString("EXTRA_STATUS_MESSAGE")}") "There was an error installing Termux. Please retry.".showSnackbar( binding.root, true ) binding.termuxInstallCard.hideProgress() } } else -> { lifecycleScope.launch(Dispatchers.Main) { println("$packageName Install failed else!") // exitActivity("Package failed to install -> Unknown Error!") binding.termuxInstallCard.hideProgress() } } } } } } }

我真的很感激你的帮助!



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有