gpt4 book ai didi

android - 在 Marshmallow 上以编程方式安装 APK

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:36:48 25 4
gpt4 key购买 nike

在我的一个用例中,开始时应用程序联系服务器并下载同一应用程序的更新。

对于下载,我使用的是 Android 的 DownloadManager 类。然后使用下面的代码,它会尝试在 onReceive() 中创建应用程序安装程序 Intent ,即在成功下载 APK 之后。

@Override
public void onReceive(Context context, Intent intent) {

//check if the broadcast message is for our Enqueued download
long referenceId = intent.getLongExtra(DownloadManager.EXTRA_DOWNLOAD_ID, -1);
if (downloadReference == referenceId) {
try {
Log.v("", "Downloading of the new app version complete");

String filepath = Environment.getExternalStorageDirectory() + "/" +
Environment.DIRECTORY_DOWNLOADS + "/" + mLatestVersionFileName;

//start the installation of the latest version
Uri uri = downloadManager.getUriForDownloadedFile(downloadReference);

//downloadManager.getUriForDownloadedFile(downloadReference)
Uri fileLoc = Uri.fromFile(new File(filepath));

Intent promptInstall = new Intent(Intent.ACTION_VIEW);
promptInstall.setDataAndType(uri, "application/vnd.android.package-archive");
promptInstall.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(promptInstall);
} catch (Exception e) {
e.printStackTrace();
}

}
}

该代码适用于 Pre-Marshmallow 设备,用户会看到安装 APK 的屏幕。

这不适用于 Marshmallow 设备。

我在 Marshmallow 上遇到以下异常:

android.content.ActivityNotFoundException: No Activity found to handle Intent { act=android.intent.action.VIEW dat=content://downloads/my_downloads/287 typ=application/vnd.android.package-archive flg=0x10000000 }

我已经尝试过以下事情:

  1. 使用 Marshmallow 的确切 PackageInstaller (com.google.android.packageinstaller/com.android.packageinstaller.PackageInstallerActivity) 组件名称作为 Intent 的一部分。
  2. 传递 fileLoc 而不是 uri。
promptInstall.setDataAndType(uri, "application/vnd.android.package-archive");

这会导致“解析错误”。

理想情况下, Intent 由 Android 操作系统解决。我想这不是什么大问题,我可能在创建 Intent 时遗漏了一些东西。

最佳答案

试试这个

 public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
if (DownloadManager.ACTION_DOWNLOAD_COMPLETE.equals(action)) {
long downloadId = intent.getLongExtra(
DownloadManager.EXTRA_DOWNLOAD_ID, 0);
Query query = new Query();
query.setFilterById(enqueue);
Cursor c = dm.query(query);
if (c.moveToFirst()) {
int columnIndex = c
.getColumnIndex(DownloadManager.COLUMN_STATUS);
if (DownloadManager.STATUS_SUCCESSFUL == c
.getInt(columnIndex)) {

ImageView view = (ImageView) findViewById(R.id.imageView1);
String uriString = c
.getString(c
.getColumnIndex(DownloadManager.COLUMN_LOCAL_URI));

//start the installation of the latest version
Uri uri = Uri.parse(uriString);
Intent promptInstall = new Intent(Intent.ACTION_VIEW);
promptInstall.setDataAndType(uri, "application/vnd.android.package-archive");
promptInstall.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
mContext.startActivity(promptInstall);
}
}
}
}

关于android - 在 Marshmallow 上以编程方式安装 APK,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37247062/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com