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更新安装,需要按照以下流程操作:
- 先将远端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);
- 监听下载完成事件,获取本地APK文件路径
下载完成后从DownloadManager查询本地文件路径,或者直接访问预设的下载路径:
Java.IO.File apkFile = new Java.IO.File(Android.OS.Environment.GetExternalStoragePublicDirectory(Android.OS.Environment.DirectoryDownloads), "update.apk");
- 再调用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
相关产品推荐
相关产品推荐

