MAUI Android 10 程序化安装APK遇FileProvider类找不到异常求助
解决Android 10中程序化安装APK的ClassNotFoundException问题
你遇到的ClassNotFoundException是因为Xamarin Android现在默认使用AndroidX库,而非旧的Android Support库,你的配置和代码还在引用已被淘汰的android.support.v4.content.FileProvider,导致系统找不到该类。
以下是具体修复步骤:
1. 替换AndroidManifest.xml中的FileProvider配置
将旧的Support库路径替换为AndroidX路径,同时更新meta-data的名称:
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="{PackName}"> <application android:allowBackup="true" android:icon="@mipmap/appicon" android:roundIcon="@mipmap/appicon_round" android:supportsRtl="true" android:label="{Label}"> <!-- 替换为AndroidX的FileProvider --> <provider android:name="androidx.core.content.FileProvider" android:authorities="{PackName}.provider" android:exported="false" android:grantUriPermissions="true"> <!-- 更新meta-data名称为AndroidX对应的字段 --> <meta-data android:name="androidx.core.content.FileProvider.PATHS" android:resource="@xml/provider_paths" /> </provider> </application> <!-- 注意:INSTALL_PACKAGES是系统权限,普通应用请添加REQUEST_INSTALL_PACKAGES权限 --> <uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE" /> <uses-sdk android:minSdkVersion="24"/> </manifest>
2. 确保项目引用AndroidX相关NuGet包
在NuGet包管理器中安装Xamarin.AndroidX.Core包,这是AndroidX FileProvider的依赖库。
3. 修改代码中的FileProvider引用
将代码里的旧Support库FileProvider替换为AndroidX版本:
using AndroidX.Core.Content; // 添加这个命名空间 Context context = AndroidApp.Context; var file = new Java.IO.File(fileUri); if (Build.VERSION.SdkInt >= BuildVersionCodes.N) { // 使用AndroidX的FileProvider var apkUri = FileProvider.GetUriForFile(context, context.ApplicationContext.PackageName + ".provider", file); Intent intentS = new Intent(Intent.ActionInstallPackage); intentS.SetData(apkUri); intentS.SetFlags(ActivityFlags.GrantReadUriPermission); // Android 8.0+需要先检查是否有安装未知应用的权限 if (Build.VERSION.SdkInt >= BuildVersionCodes.O) { if (!context.PackageManager.CanRequestPackageInstalls()) { Intent permissionIntent = new Intent(Android.Provider.Settings.ActionManageUnknownAppSources, Android.Net.Uri.Parse("package:" + context.PackageName)); // 这里需要启动Activity并处理权限回调,比如用StartActivityForResult ((Activity)context).StartActivityForResult(permissionIntent, 1001); return; } } context.StartActivity(intentS); }
额外注意事项
- Android 10(API 29)启用了Scoped Storage,你的
provider_paths.xml配置是正确的,external-path指向外部存储根目录,能访问下载文件夹的文件。 INSTALL_PACKAGES权限仅适用于系统应用或拥有系统签名的应用,普通应用请使用REQUEST_INSTALL_PACKAGES权限,并在代码中检查是否允许安装未知来源应用(Android 8.0+要求)。
内容的提问来源于stack exchange,提问作者Gibrid
相关产品推荐
相关产品推荐

