- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我使用 PackageInstaller 和 PackageInstaller.Session 从我的应用程序安装应用程序。我想在安装失败时在我的应用程序中显示一条消息(例如,如果 apk 签名错误)。我如何获得安装 session 的结果?
最佳答案
当您commit()
您的Session
时,您需要提供一个IntentSender
,它指向某个组件,例如广播接收器
。在这里,我在 installCoroutine()
中执行此操作:
/*
Copyright (c) 2019 CommonsWare, LLC
Licensed under the Apache License, Version 2.0 (the "License"); you may not
use this file except in compliance with the License. You may obtain a copy
of the License at http://www.apache.org/licenses/LICENSE-2.0. Unless required
by applicable law or agreed to in writing, software distributed under the
License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS
OF ANY KIND, either express or implied. See the License for the specific
language governing permissions and limitations under the License.
Covered in detail in the book _Elements of Android Q
https://commonsware.com/AndroidQ
*/
package com.commonsware.q.appinstaller
import android.app.Application
import android.app.PendingIntent
import android.content.Intent
import android.content.pm.PackageInstaller
import android.net.Uri
import androidx.documentfile.provider.DocumentFile
import androidx.lifecycle.AndroidViewModel
import androidx.lifecycle.viewModelScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext
private const val NAME = "mostly-unused"
private const val PI_INSTALL = 3439
class MainMotor(app: Application) : AndroidViewModel(app) {
private val installer = app.packageManager.packageInstaller
private val resolver = app.contentResolver
fun install(apkUri: Uri) {
viewModelScope.launch(Dispatchers.Main) {
installCoroutine(apkUri)
}
}
private suspend fun installCoroutine(apkUri: Uri) =
withContext(Dispatchers.IO) {
resolver.openInputStream(apkUri)?.use { apkStream ->
val length =
DocumentFile.fromSingleUri(getApplication(), apkUri)?.length() ?: -1
val params =
PackageInstaller.SessionParams(PackageInstaller.SessionParams.MODE_FULL_INSTALL)
val sessionId = installer.createSession(params)
val session = installer.openSession(sessionId)
session.openWrite(NAME, 0, length).use { sessionStream ->
apkStream.copyTo(sessionStream)
session.fsync(sessionStream)
}
val intent = Intent(getApplication(), InstallReceiver::class.java)
val pi = PendingIntent.getBroadcast(
getApplication(),
PI_INSTALL,
intent,
PendingIntent.FLAG_UPDATE_CURRENT
)
session.commit(pi.intentSender)
session.close()
}
}
}
然后,您的组件可以查看 EXTRA_STATUS
来获取状态:
/*
Copyright (c) 2019 CommonsWare, LLC
Licensed under the Apache License, Version 2.0 (the "License"); you may not
use this file except in compliance with the License. You may obtain a copy
of the License at http://www.apache.org/licenses/LICENSE-2.0. Unless required
by applicable law or agreed to in writing, software distributed under the
License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS
OF ANY KIND, either express or implied. See the License for the specific
language governing permissions and limitations under the License.
Covered in detail in the book _Elements of Android Q
https://commonsware.com/AndroidQ
*/
package com.commonsware.q.appinstaller
import android.content.BroadcastReceiver
import android.content.Context
import android.content.Intent
import android.content.pm.PackageInstaller
import android.media.AudioManager
import android.media.ToneGenerator
import android.util.Log
private const val TAG = "AppInstaller"
class InstallReceiver : BroadcastReceiver() {
override fun onReceive(context: Context, intent: Intent) {
when (val status = intent.getIntExtra(PackageInstaller.EXTRA_STATUS, -1)) {
PackageInstaller.STATUS_PENDING_USER_ACTION -> {
val activityIntent =
intent.getParcelableExtra<Intent>(Intent.EXTRA_INTENT)
context.startActivity(activityIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK))
}
PackageInstaller.STATUS_SUCCESS ->
ToneGenerator(AudioManager.STREAM_NOTIFICATION, 100)
.startTone(ToneGenerator.TONE_PROP_ACK)
else -> {
val msg = intent.getStringExtra(PackageInstaller.EXTRA_STATUS_MESSAGE)
Log.e(TAG, "received $status and $msg")
}
}
}
}
看起来像STATUS_FAILURE_INVALID
将是无效签名的签名。
关于Android PackageInstaller安装结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62041473/
查看 Android (AOSP) 的源代码,installPackage标记为已弃用并检查 Android 的 PackageManager 应用程序,它使用 PackageInstaller创建一
我正在开发一个以设备所有者身份运行的应用程序,我想在其中构建一个自动更新程序。 为此,我使用了 PackageInstaller,因为我的设备所有者职位使我有权使用它。 private void in
您好 StackOverflow 用户, 我在 Play 商店之外有一个 Android 应用程序。它通过下载新的 APK 并使用 Intent 调用安装程序对话框来更新自身。更新功能不再适用于 An
我在 this 之后有一个名为 CosuUtils 的类类非常接近。我正在以编程方式更新作为设备所有者的应用程序。这在 Android 6 中运行良好,但在 Android 7 中尝试更新时出现以下错
编辑:我添加了 API 级别 29 或更高版本的解决方案。但是,这并不能解决我的问题。 如果有人提出 API 级别 28 或更早的方法,我将不胜感激。 原始问题: 我正在使用以下代码安装 apk: f
我使用 PackageInstaller API 来安装我的 apk。我可以获得 Android PackageInstaller 取消按钮回调吗?如果是,我该怎么办?或者根本不可能。 最佳答案 如果
我的应用程序具有设备管理员权限,但我无法使用 packageinstaller 卸载该应用程序。当我的代码运行时,它还没有抛出任何错误,我尝试卸载的应用程序仍保留在那里。知道可能出什么问题吗?或者如何
我正在尝试仅通过使用 PackageInstaller 和 PackageManager API 在我的设备上安装包(从在其上运行的设备所有者应用程序)。我一直在寻找示例,但找不到适合我需要的任何内容
我在 google play 上发布了一个 android 应用程序。 我过去遇到过一些黑客和盗版问题[反编译的人修改并重新编译应用程序然后将其发布在某个地方] 为了减少问题,我采取的其中一项措施是中
PackageInstaller 成功(自行)更新应用程序后,应用程序将关闭并且不再启动。 可能重复:Android PackageInstaller, re-open the app after i
我生成了我的应用APK文件。 现在,当我试图通过我的设备打开它时,我得到了: 5474-5474/? E/AndroidRuntime﹕ FATAL EXCEPTION: main Proce
作为一些背景知识,我正在 Xamarin 中为一家企业编写一个 Android 应用程序,它应该能够自行更新,而不是通过 Play 商店进行更新。特别是有一种设备无法自行更新,我不明白为什么。 更新的
这是关于托管在 google 代码项目上的包安装程序开源项目的一个非常精确的问题:http://android.amberfog.com/?p=98 当我尝试编译它时,我得到了这个类的 ClassNo
使用 ACTION_UNINSTALL_PACKAGE 卸载 Android 应用程序的旧方法在 API 级别 29 中已弃用。现在建议使用 PackageInstaller.uninstall(pa
我只是尝试测试一个简单的应用程序,它获取设备的位置并将其打印在 TextView 上,我在 Android Studio 上使用 Record Espresso Test 选项,我测试了运行时权限请求
是否可以在不使用 packageInstaller 的情况下知道是否从 Play 商店安装了 Android 应用程序?每个其他问题都与任何人都可以编辑的 packageInstaller 有关,但我
我最近开始使用 Android Studio 而不是 Eclipse。我使用 Android Studio 将 Eclipse 项目导入并迁移到 Android Studio 中。如果我使用 AS 构
我正在使用 selenium Appium 自动化应用程序 Selenium 更高版本 Appium 1.9.1 每当应用程序启动时,总是弹出权限,显示成功,我可以使用自动化点击权限,但在授予权限
请检查下面的类并给我有关如何使用它们的建议 https://developer.android.com/reference/android/content/pm/PackageInstaller.ht
我正在尝试使用 Xamarin android 编写概念验证代码。一种 EMM 工具,即负责安装其他应用程序和管理设备的应用程序。所以 Android Marshmallow 是开始使用 androi
我是一名优秀的程序员,十分优秀!