从 Xamarin Forms 安装 APK

Install APK from Xamarin Forms

我想在 VS2019 中使用 FileProvider 从存储目录安装 APK 文件 - .Net Standard2.1 和 Target Framework API28 for Android。但是我得到了错误 "The name 'FileProvider' does not exist in the current context". 即使我尝试更改 .Net 2.0 也有同样的错误。

Java.IO.File file = new Java.IO.File(filepath);
                    if (Build.VERSION.SdkInt >= BuildVersionCodes.N)
                    {
                        Android.Net.Uri URIAPK = FileProvider.GetUriForFile(Android.App.Application.Context, Android.App.Application.Context.ApplicationContext.PackageName + ".provider", filepath);
                        Intent intS = new Intent(Intent.ActionInstallPackage);
                        intS.SetData(URIAPK);
                        intS.SetFlags(ActivityFlags.GrantReadUriPermission);
                        Android.App.Application.Context.StartActivity(intS);
                    }
                    else
                    {
                        Android.Net.Uri URIAPK = Android.Net.Uri.FromFile(filepath);
                        Intent intS = new Intent(Intent.ActionView);
                        intS.SetDataAndType(URIAPK, "application/vnd.android.package-archive");
                        intS.SetFlags(ActivityFlags.NewTask);
                        Android.App.Application.Context.StartActivity(intS);
                    }

我尝试使用命名空间 "Using Android.v4.content.FileProvider;" 仍然出错,因为缺少 .dll 所以,当我要安装时 Xamarin.Android.Support.Compat Nuget 遇到抑制错误

NU1202 Package Xamarin.Android.Support.Compat 28.0.0.3 is not compatible with netstandard2.1 (.NETStandard,Version=v2.1). Package Xamarin.Android.Support.Compat 28.0.0.3 supports:

  • monoandroid60 (MonoAndroid,Version=v6.0)
  • monoandroid70 (MonoAndroid,Version=v7.0)
  • monoandroid71 (MonoAndroid,Version=v7.1)
  • monoandroid80 (MonoAndroid,Version=v8.0)
  • monoandroid81 (MonoAndroid,Version=v8.1)
  • monoandroid90 (MonoAndroid,Version=v9.0)

给我安装 APK 文件的解决方案或任何其他方法。

But I got the error "The name 'FileProvider' does not exist in the current context"

这个错误,请参考正确的包。一般建议使用最新的nuget Xamarin.AndroidX.AppCompat

在代码中,我们应该按如下方式导入这个 nuget:

using AndroidX.AppCompat.App;
using AndroidX.Core.Content; 

FileProvider的总代码应该是:

Android.Net.Uri URIAPK = AndroidX.Core.Content.FileProvider.GetUriForFile(Android.App.Application.Context, Android.App.Application.Context.ApplicationContext.PackageName + ".provider", filepath);

在这种情况下,错误“名称 'FileProvider' 在当前上下文中不存在”将消失。

如果你想使用最新的nuget Xamarin.AndroidX.AppCompat,你应该将你的应用程序迁移到AndroidX,更多信息,你可以查看文档:https://docs.microsoft.com/en-us/xamarin/android/platform/androidx#migration-tooling .

此外,记得添加正确的附加配置文件以遵守新的严格模式:

(AndroidX) 将以下内容添加到 <application> 标签内的 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/file_paths"></meta-data>
</provider>

有关更多信息,请查看:https://github.com/jamesmontemagno/MediaPlugin#android-file-provider-setup

注:

我们强烈建议您升级到最新的 Visual Studio 并默认使用较新的 Nugets 以避免迁移和兼容性问题。