Xamarin Android中FileProvider.GetUriForFile空引用异常求助
Android安装APK触发System.NullReferenceException问题排查与解决
在安装下载的APK文件时触发System.NullReferenceException:“对象引用未设置到对象的实例”,以下是问题排查过程及最终解决办法:
报错代码
var file = new Java.IO.File(filePath); if (Build.VERSION.SdkInt >= Android.OS.BuildVersionCodes.N) { System.Diagnostics.Debug.WriteLine(MainActivity.Instance.ApplicationContext.PackageName + ".fileProvider"); //此处报错 Uri apkUri = AndroidX.Core.Content.FileProvider.GetUriForFile(MainActivity.Instance, MainActivity.Instance.ApplicationContext.PackageName + ".fileProvider", file); Intent intentS = new Intent(Intent.ActionInstallPackage); intentS.SetData(apkUri); intentS.SetFlags(ActivityFlags.GrantReadUriPermission); MainActivity.Instance.StartActivity(intentS); }
MainActivity代码
[Activity(Label = "Dyspozycja Rewizor", Icon = "@mipmap/icon", Theme = "@style/MainTheme", MainLauncher = true, //Name ="Dysp.Rew.MainActivity", ConfigurationChanges = ConfigChanges.ScreenSize | ConfigChanges.Orientation | ConfigChanges.UiMode | ConfigChanges.ScreenLayout | ConfigChanges.SmallestScreenSize)] [ContentProvider( new[] { "${applicationId}.provider" }, Name = "AndroidX.Core.Content.FileProvider", Exported = false, GrantUriPermissions = true)] [MetaData( "android.support.FILE_PROVIDER_PATHS", Resource = "@xml/file_paths")] public class MainActivity : global::Xamarin.Forms.Platform.Android.FormsAppCompatActivity { internal static MainActivity Instance { get; private set; } protected override void OnCreate(Bundle savedInstanceState) { base.OnCreate(savedInstanceState); Instance = this; Xamarin.Essentials.Platform.Init(this, savedInstanceState); global::Xamarin.Forms.Forms.Init(this, savedInstanceState); DependencyService.Register<IInstallerService, InstallerService>(); LoadApplication(new App()); } public override void OnRequestPermissionsResult(int requestCode, string[] permissions, [GeneratedEnum] Android.Content.PM.Permission[] grantResults) { Xamarin.Essentials.Platform.OnRequestPermissionsResult(requestCode, permissions, grantResults); base.OnRequestPermissionsResult(requestCode, permissions, grantResults); } }
尝试过的FileProvider配置
特性配置(MainActivity上标注)
已在MainActivity类上添加[ContentProvider]和[MetaData]特性,如上述代码所示。
AndroidManifest.xml配置
<application android:debuggable="true" android:label="Dyspozycja Rewizor"> <provider android:name="androidx.core.content.FileProvider" android:authorities="${applicationId}.provider" android:exported="false" android:grantUriPermissions="true"> <meta-data android:name="android.support.FILE_PROVIDER_PATHS" android:resource="@xml/file_paths"></meta-data> </provider> </application>
file_paths.xml配置
<?xml version="1.0" encoding="utf-8"?> <paths xmlns:android="http://schemas.android.com/apk/res/android"> <files-path name="my_docs" path="docs/"/> <external-path name="external_files" path="."/> </paths>
另一种Intent启动方式(同样触发异常)
Intent intent = new Intent(Intent.ActionView); intent.SetDataAndType(Uri.FromFile(new Java.IO.File(filePath)), "application/vnd.android.packagearchive"); intent.SetFlags(ActivityFlags.NewTask); //此处报错 MainActivity.Instance.StartActivity(intent);
最终问题根源
AndroidManifest.xml中存在重复的<application>节点,导致配置失效:
<application android:label="JakubStegienko.rewizor" android:theme="@style/MainTheme" android:icon="@mipmap/icon"></application>
解决方案
删除AndroidManifest.xml中重复的<application>节点,确保整个配置文件仅保留一个<application>节点,并将FileProvider的配置正确嵌套在该节点内部。
内容的提问来源于stack exchange,提问作者Axlii50
相关产品推荐
相关产品推荐

