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

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)

安装时提示:解析包时出错

错误原因分析

  1. FileProvider空引用问题:要么是指定路径下的APK文件未成功下载(文件不存在),要么是文件存储路径未在provider_paths中配置,导致FileProvider无法映射该路径,最终触发空引用。
  2. 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 10:31:12