在Xamarin Forms中启动一个Android活动?

6

我正在尝试使用以下代码在我的应用程序中使用默认的Android PDF查看器查看托管的PDF文件:

            var intent = new Intent(Intent.ActionView);

            intent.SetDataAndType(Uri.Parse("http://sample/url.pdf"), "application/pdf");
            intent.SetFlags(ActivityFlags.ClearTop);
            Android.Content.Context.StartActivity(intent);

我在一个原生项目中使用过这段代码,所以我知道它可以在Android活动中工作。对于Xamarin Forms,是否有办法让我从内容页面启动Android活动,反之亦然?

3个回答

15
您可以使用DependencyService来实现此功能: PCL中的INativePages:
 public interface INativePages
{
    void StartActivityInAndroid();
}

Xamarin.Android中实现该接口:

[assembly: Xamarin.Forms.Dependency(typeof(NativePages))]
namespace PivotView.Droid
{
    public class NativePages : INativePages
    {
        public NativePages()
        {
        }

        public void StartAc()
        {
            var intent = new Intent(Forms.Context, typeof(YourActivity));
            Forms.Context.StartActivity(intent);
        }

    }
}

在PCL中启动Android Activity

    private void Button_Clicked(object sender, EventArgs e)
    {
        Xamarin.Forms.DependencyService.Register<INativePages>();
        DependencyService.Get<INativePages>().StartAc();
    }

我有一个外部存储文件路径“/storage/emulated/0/Android/data/com.XYZ.projectName/file/Download/sample.pdf”。那么,如何从这个URL打开文件? - RMR
2
Forms.Context 在版本2.5中已经过时。 - Ash
使用Android.App.Application.Context来获取上下文。 - Mohamed Saleh
2
[assembly: Xamarin.Forms.Dependency(typeof(NativePages))] 装饰器已经在依赖服务中注册了接口,因此不需要显式地使用 Xamarin.Forms.DependencyService.Register<INativePages>(); - CodingLumis

2

Forms.Context现已过时。 解决方法是在Android项目的主活动类中实例化当前上下文,如下所示:

public class MainActivity : global::Xamarin.Forms.Platform.Android.FormsAppCompatActivity 
{
  public static Xamarin.Forms.Platform.Android.FormsAppCompatActivity Instance { get; private set; }

  protected override void OnCreate(Bundle bundle)
  {
        base.OnCreate(savedInstanceState);

        Xamarin.Essentials.Platform.Init(this, savedInstanceState);
        global::Xamarin.Forms.Forms.Init(this, savedInstanceState);

        LoadApplication(new App());
        Instance = this;
  }

在你的NativePages StartAc()方法中检索本地上下文,如下所示:
public void StartAc()
    {
      var intent = new Intent(MainActivity.Instance, typeof(YourActivity));
      MainActivity.Instance.StartActivity(intent);
    }

0
在Android项目中创建一个用于该函数的类:
public class PdfLauncher : IPdfLauncher
{
    public void LaunchPdf(string url)
    {
        //implementation
    }
}

创建一个可移植项目中的接口。
public interface IPdfLauncher
{
    void LaunchPdf(string url);
}

在你的视图模型中添加一个属性,这样你就可以从你的可移植项目中调用该函数。
public IPdfLauncher PdfLauncher {get;set;}

将接口添加到您的ViewModel构造函数中,并传入在Android主活动中创建的实例。现在,您可以从XForms命令调用Android代码,如果您添加了iOS或UWP,则可以在这些项目中简单地实现该接口并在运行时传递它们。我使用MVVM中的注入框架来自动创建这些平台特定的实现,并且如果您发现经常进行此类操作,我建议您研究一下它。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接