Xamarin Forms:如何从另一个应用程序打开一个应用程序?

Sre*_*ree 5 android ios xamarin.forms uwp

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

我按照这个线程尝试过如下:

在视图中

var appname = @"otherappId";
var result = await DependencyService.Get<IAppHandler>().LaunchApp(appname);
Run Code Online (Sandbox Code Playgroud)

界面

public interface IAppHandler
{
    Task<bool> LaunchApp(string uri);
}
Run Code Online (Sandbox Code Playgroud)

安卓

[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);
    }
}
Run Code Online (Sandbox Code Playgroud)

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);
        }
    }
Run Code Online (Sandbox Code Playgroud)
  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 在我的应用程序中打开另一个应用程序?

LeR*_*Roy 6

您是否尝试过使用 Xamarin Essentials : Xamarin.Essentials:启动器

   public class LauncherTest
{
    public async Task OpenRideShareAsync()
    {
        var supportsUri = await Launcher.CanOpenAsync("lyft://");
        if (supportsUri)
            await Launcher.OpenAsync("lyft://ridetype?id=lyft_line");
    }
}
Run Code Online (Sandbox Code Playgroud)

打开特定应用程序时不要忘记使用正确的包名称


Luc*_*ang 5

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;
        }

    }
}
Run Code Online (Sandbox Code Playgroud)

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