【问题标题】:Failing to open a file from dependency service in Xamarin.Forms on Android无法在 Android 上的 Xamarin.Forms 中从依赖项服务打开文件
【发布时间】:2019-11-12 04:21:05
【问题描述】:

我找不到如何从依赖服务打开 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 }

我还尝试使用不同的方法来获取应用程序上下文 - var context = MonoAndroid.App.Application.Context;,但是好像是通过Plugin.CurrentActivity获取的上下文和这个方法是一样的。


新编辑

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

【问题讨论】:

  • 只需使用任何普通的 .NET System.IO.File 方法
  • 我需要向用户呈现对话框使用完成操作stackoverflow.com/questions/17165972/…
  • @LucasZhang-MSFT 遗憾的是,我没有。我更新了原来的问题。
  • 你能分享一个包含问题的样本,以便我可以测试它。
  • 原来问题不在活动/上下文中。如果我注释掉 intent.SetDataAndType(path, mimeType); 行,它实际上会继续并显示带有三个选项的弹出窗口:i.imgur.com/NJOiIop.png

标签: android android-intent android-activity xamarin.forms


【解决方案1】:

您似乎使用了插件 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

这个问题好像是app找不到当前的Activity,所以你也可以使用

Android.App.Application.Context

如果问题仍然存在,您可以创建一个包含该问题的示例,以便我可以测试它。

【讨论】:

  • 我有覆盖方法OnCreate的内容和你的一样。我会尝试Android.App.Application.Context 方法。
【解决方案2】:

问题出在完全不同的地方。该设备未安装能够处理文件类型 (application/pdf) 的应用程序。然而,Android 给出的例外,给了我零线索。

我必须做的是,通过调用intent.ResolveActivity(context.PackageManager) 检查用户是否安装了适当的应用程序。

这是我所做的:

Plugin.CurrentActivity.ICurrentActivity activity = Plugin.CurrentActivity.CrossCurrentActivity.Current;
Context context = activity.AppContext;

using (var intent = new Intent(Intent.ActionView))
{
    intent.SetDataAndType(path, mimeType);
    intent.AddFlags(ActivityFlags.NewTask);
    intent.AddFlags(ActivityFlags.GrantReadUriPermission);
    intent.AddFlags(ActivityFlags.ClearTop);

    ComponentName component = intent.ResolveActivity(context.PackageManager);
    // If the ResolveActivity returned null, we have no application installed
    // to handle our file type.
    if (component == null)
    {
        using (Toast toast = Toast.MakeText(context, new Java.Lang.String("No app installed to open this file."), ToastLength.Short))
        {
            toast.Show();
        }
        return false;
    }
    else
    {
        try
        {
            context.StartActivity(intent);
            return true;
        }
        catch (Exception ex)
        {
            Debug.WriteLine($"Failed to launch intent to open file. Exception message: {ex.Message}");
            using (Toast toast = Toast.MakeText(context, new Java.Lang.String("Can't open file."), ToastLength.Short))
            {
                toast.Show();
            }
            return false;
        }
    }
}

【讨论】:

    猜你喜欢
    • 2021-12-22
    • 2019-01-01
    • 2021-01-19
    • 1970-01-01
    • 1970-01-01
    • 2022-12-21
    • 1970-01-01
    • 1970-01-01
    • 2021-06-09
    相关资源
    最近更新 更多