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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 05:10:38