Xamarin Android中FileProvider.GetUriForFile空引用异常解决
解决Xamarin Android中FileProvider.GetUriForFile空引用及APK安装解析错误问题
问题场景
在Xamarin Android项目中实现从网站下载APK并安装时,遇到两个核心问题:
- 调用
FileProvider.GetUriForFile方法时触发System.NullReferenceException - 改用
Uri.Parse生成Uri后,启动安装Intent时提示“解析包时出错”
相关代码与配置
原下载安装核心代码
// 触发NullReferenceException的代码 var file = new File(downloadPath, "update.apk"); var uri = FileProvider.GetUriForFile(this, PackageName + ".fileprovider", file); // 尝试过的Uri.Parse方式 var uri = Uri.Parse("file://" + file.AbsolutePath); var installIntent = new Intent(Intent.ActionView); installIntent.SetDataAndType(uri, "application/vnd.android.package-archive"); installIntent.AddFlags(ActivityFlags.NewTask); installIntent.AddFlags(ActivityFlags.GrantReadUriPermission); StartActivity(installIntent);
AndroidManifest.xml配置
<provider android:name="androidx.core.content.FileProvider" android:authorities="${applicationId}.fileprovider" android:exported="false" android:grantUriPermissions="true"> <meta-data android:name="android.support.FILE_PROVIDER_PATHS" android:resource="@xml/provider_paths" /> </provider>
res/xml/provider_paths.xml内容
<?xml version="1.0" encoding="utf-8"?> <paths xmlns:android="http://schemas.android.com/apk/res/android"> <external-files-path name="external_files" path="." /> <files-path name="files" path="." /> </paths>
调试日志片段
System.NullReferenceException: Object reference not set to an instance of an object
at AndroidX.Core.Content.FileProvider.GetUriForFile(Context context, String authority, File file)安装时提示:解析包时出错
错误原因分析
- FileProvider空引用问题:要么是指定路径下的APK文件未成功下载(文件不存在),要么是文件存储路径未在
provider_paths中配置,导致FileProvider无法映射该路径,最终触发空引用。 - Uri.Parse解析包错误:Android 7.0及以上系统禁止直接使用
file://格式的Uri传递文件给其他应用,即使绕过权限异常,系统也会因为无法读取文件导致安装包解析失败。
解决方法:修改文件存储路径
将APK文件存储到provider_paths已配置的合法目录下,比如App的外部文件目录,确保FileProvider能正确映射路径:
// 获取App专属的外部文件目录,该路径已在provider_paths中配置 var externalFilesDir = GetExternalFilesDir(null); var downloadPath = externalFilesDir.AbsolutePath; var apkFile = new File(downloadPath, "update.apk"); // 必须确保文件下载完成后再执行安装逻辑 if (apkFile.Exists()) { var apkUri = FileProvider.GetUriForFile(this, PackageName + ".fileprovider", apkFile); var installIntent = new Intent(Intent.ActionView); installIntent.SetDataAndType(apkUri, "application/vnd.android.package-archive"); installIntent.AddFlags(ActivityFlags.NewTask); installIntent.AddFlags(ActivityFlags.GrantReadUriPermission); // 授予系统读取该Uri的权限 GrantUriPermission(null, apkUri, ActivityFlags.GrantReadUriPermission); StartActivity(installIntent); }
修改存储路径后,FileProvider可以生成合法的content://格式Uri,既避免了空引用异常,也让系统能正常读取APK文件完成安装。
内容的提问来源于stack exchange,提问作者Axlii50
相关产品推荐
相关产品推荐

