首页 > 解决方案 > 无法在 Android 上的 Xamarin.Forms 中从依赖项服务打开文件

问题描述

我找不到如何从依赖服务打开 Android 中 Xamarin.Forms 上的文件的方法。

通过打开文件,我的意思是向用户显示本机 UI 以选择他想要打开文件的方式。

            XPlat.Storage.IStorageFile storageFile = await blob.GetContentFileAsync();
            File javaFile = new File(storageFile.Path);
            Plugin.CurrentActivity.ICurrentActivity activity = Plugin.CurrentActivity.CrossCurrentActivity.Current;
            Context context = activity.AppContext;
            Uri path = FileProvider.GetUriForFile(context, context.PackageName, javaFile);


            var intent = new Intent(Intent.ActionView);
            intent.AddFlags(ActivityFlags.NewTask);
            intent.AddFlags(ActivityFlags.GrantReadUriPermission);
            intent.AddFlags(ActivityFlags.ClearTop);
            string mimeType = MimeTypes.GetMimeType(System.IO.Path.GetExtension(blob.UniqueName));


            intent.SetDataAndType(path, mimeType);
            context.PackageManager.GetPackageInfo(context.PackageName, PackageInfoFlags.Activities);

            context.StartActivity(intent);

调用StartActivity(intent)方法时抛出异常

Android.Content.ActivityNotFoundException: No Activity found to handle Intent { act=android.intent.action.VIEW dat=content://com.company.appname/root/data/data/com.company.appname/files/Blobs/file.pdf typ=application/pdf }

我也尝试使用不同的方法来获取 Application context - var context = MonoAndroid.App.Application.Context;,但似乎通过Plugin.CurrentActivity这种方法获得的上下文是相同的。

观看窗口截图


新编辑

注释掉该行intent.SetDataAndType(path, mimeType);会导致以下弹出窗口。

弹出

标签: androidandroid-intentandroid-activityxamarin.forms

解决方案


您似乎使用了插件CurrentActivityPlugin。确保已将其安装在 MainActivity

protected override void OnCreate(Bundle savedInstanceState)
{
  TabLayoutResource = Resource.Layout.Tabbar;
  ToolbarResource = Resource.Layout.Toolbar;

  base.OnCreate(savedInstanceState);

  CrossCurrentActivity.Current.Init(this, savedInstanceState);
  Xamarin.Essentials.Platform.Init(this, savedInstanceState);
  global::Xamarin.Forms.Forms.Init(this, savedInstanceState);
  LoadApplication(new App());
}

Android.Content.ActivityNotFoundException

这个问题似乎应用程序找不到当前的活动,所以你也可以使用

Android.App.Application.Context

如果问题仍然出现,您可以创建一个包含问题的示例,以便我可以在我这边进行测试。


推荐阅读