首页 > 解决方案 > Xamarin Forms:如何从另一个应用程序打开一个应用程序?

问题描述

我有 2 个使用 Xamarin.Forms 开发的应用程序(A 和 B)。我需要从应用 B 打开应用 A。

根据这个线程,我已经尝试如下:

在视图中

var appname = @"otherappId";
var result = await DependencyService.Get<IAppHandler>().LaunchApp(appname);

界面

public interface IAppHandler
{
    Task<bool> LaunchApp(string uri);
}

安卓

[Activity(Label = "OpenAppAndroid")]
public class OpenAppAndroid : Activity, IAppHandler
{
    public Task<bool> LaunchApp(string uri)
    {
        bool result = false;

        try
        {
            var aUri = Android.Net.Uri.Parse(uri.ToString());
            var intent = new Intent(Intent.ActionView, aUri);
            Xamarin.Forms.Forms.Context.StartActivity(intent);
            result = true;
        }
        catch (ActivityNotFoundException)
        {
            result = false;
        }

        return Task.FromResult(result);
    }
}

IOS

public class OpenAppiOS : IAppHandler
{
    public Task<bool> LaunchApp(string uri)
    {
        try
        {
            var canOpen = UIApplication.SharedApplication.CanOpenUrl(new NSUrl(uri));

            if (!canOpen)
                return Task.FromResult(false);

            return Task.FromResult(UIApplication.SharedApplication.OpenUrl(new NSUrl(uri)));

        }
        catch (Exception ex)
        {
            return Task.FromResult(false);
        }
    }
  1. 对于android,我System.NullReferenceException: 'Object reference not set to an instance of an object.'在运行项目时得到了。我不知道代码中的应用名称是什么?我试过用包名。

  2. 此外,如果设备上未安装 android 应用程序,则需要打开 Play 商店下载该应用程序。

  3. 我没有测试 iOS 部分,因为 Mac 不可用。上面的代码适用于 iOS 吗?另外,如果 iPhone 上没有安装该应用程序,则需要打开 AppStore 下载该应用程序。

  4. 另外,我喜欢为 UWP 实现相同的功能。

参考: https : //forums.xamarin.com/discussion/92666/detect-and-open-another-app-on-device 是否可以使用 xamarin.form 在我的应用程序中打开另一个应用程序?

标签: androidiosxamarin.formsuwp

解决方案


Xamarin.Forms.Forms.Context自 XF 2.5 以来已过时。所以你可以使用Android.App.Application.Context它来代替它或使用插件Plugin.CurrentActivity

所以你可以像下面这样修改Android中的代码

using System.Threading.Tasks;
using Android.App;
using Android.Content;
using Android.Content.PM;
using Android.OS;
using Android.Runtime;
using Android.Views;
using Android.Widget;
using App14;
using App14.Droid;
using Xamarin.Forms;

[assembly: Dependency(typeof(OpenAppAndroid))]
namespace App14.Droid
{
    public class OpenAppAndroid : IAppHandler
    {
        public Task<bool> LaunchApp(string packageName)
        {


            bool result = false;

            try
            {

                PackageManager pm = Android.App.Application.Context.PackageManager;

                if (IsAppInstalled(packageName))
                {
                    
                    Intent intent = pm.GetLaunchIntentForPackage(packageName);
                    if (intent != null)
                    {
                      
                        intent.SetFlags(ActivityFlags.NewTask);
                        Android.App.Application.Context.StartActivity(intent);
                    }
                }

                else
                {
                  
                    Intent intent = pm.GetLaunchIntentForPackage("the package name of play store on your device");
                    if (intent != null)
                    {

                        intent.SetFlags(ActivityFlags.NewTask);
                        Android.App.Application.Context.StartActivity(intent);
                    }
                }
            }
            catch (ActivityNotFoundException)
            {
                result = false;
            }

            return Task.FromResult(result);
        }


        private bool IsAppInstalled(string packageName)
        {
            PackageManager pm = Android.App.Application.Context.PackageManager;
            bool installed = false;
            try
            {
                pm.GetPackageInfo(packageName, PackageInfoFlags.Activities);
                installed = true;
            }
            catch (PackageManager.NameNotFoundException e)
            {
                installed = false;
            }

            return installed;
        }

    }
}

对于 iOS,您可以参考Launch Another IOS App from Xamarin Forms App


推荐阅读