You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android应用更新功能中FileProvider无法访问远端.apk文件问题求助

核心问题原因

你代码中最根本的错误是将远程HTTP URL直接传入Java.IO.File构造函数:

Java.IO.File f = new Java.IO.File(@"http://XX.XXX.XX.XXX/WsAgro/MAJ/XXXXXXX.apk");

Java.IO.File类仅用于访问安卓设备本地存储的文件路径,无法识别远程网络资源地址,因此FileProvider无法对不存在的本地文件生成授权Uri,直接抛出异常。

正确实现步骤

要实现远程APK更新安装,需要按照以下流程操作:

  1. 先将远端APK下载到设备本地存储
    推荐使用系统DownloadManager完成下载,示例逻辑如下:
var downloadManager = GetSystemService(DownloadService) as DownloadManager;
var request = new DownloadManager.Request(Android.Net.Uri.Parse("http://XX.XXX.XX.XXX/WsAgro/MAJ/XXXXXXX.apk"));
request.SetDestinationInExternalPublicDir(Android.OS.Environment.DirectoryDownloads, "update.apk");
request.SetNotificationVisibility(DownloadVisibility.VisibleNotifyCompleted);
// 记录下载ID后续监听下载完成
long downloadId = downloadManager.Enqueue(request);
  1. 监听下载完成事件,获取本地APK文件路径
    下载完成后从DownloadManager查询本地文件路径,或者直接访问预设的下载路径:
Java.IO.File apkFile = new Java.IO.File(Android.OS.Environment.GetExternalStoragePublicDirectory(Android.OS.Environment.DirectoryDownloads), "update.apk");
  1. 再调用FileProvider生成Uri执行安装
    你原有安装逻辑的其他部分可以复用,只需要替换为本地文件即可:
var downloadUri = FileProvider.GetUriForFile(this, "com.example.unity.fileprovider", apkFile);
Intent i = new Intent(Intent.ActionInstallPackage);
i.SetDataAndType(downloadUri, "application/vnd.android.package-archive");
i.AddFlags(ActivityFlags.GrantReadUriPermission);
i.AddFlags(ActivityFlags.NewTask); // 安装完成后引导打开页面需要加这个flag
StartActivity(i);

额外配置优化建议

  • 如果你将APK下载到应用专属缓存目录,需要修改provider_paths.xml添加对应路径配置,避免权限不足:
<paths xmlns:android="http://schemas.android.com/apk/res/android">
    <external-path name="external_files" path="." />
    <external-cache-path name="external_cache" path="." />
</paths>
  • 若后续升级targetSdkVersion到26及以上,需要动态申请REQUEST_INSTALL_PACKAGES权限,否则安装意图会被系统拦截。

内容的提问来源于stack exchange,提问作者Alexus

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 05:36:03