Не удалось открыть файл из службы зависимостей в Xamarin.Forms на Android - PullRequest
1 голос
/ 01 июля 2019

Не могу найти способ, как открыть файл на Xamarin.Forms в Android из службы зависимостей.

Под открытием файла я подразумеваю показ пользователю собственного пользовательского интерфейса, чтобы выбрать, каким способом он хочет открыть файл.

            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 (намерение)

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, и этот подход тот же.

Watch window screenshot


новое редактирование

Закомментирование строки intent.SetDataAndType(path, mimeType); приводит к появлению следующего всплывающего окна.

Popup

Ответы [ 2 ]

1 голос
/ 02 июля 2019

Похоже, вы использовали плагин 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

Если проблема все еще появляется, вы можете создать образец, содержащий проблему, чтобы я мог проверить ее на своей стороне.

0 голосов
/ 15 июля 2019

Проблема была в совершенно другом.На устройстве не было установлено приложение, способное обработать тип файла (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;
        }
    }
}
...