繁体   English   中英

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

[英]Xamarin Forms: How to open an app from another app?

我有 2 个应用程序( A 和 B )使用 Xamarin.Forms 开发。 我需要从应用程序 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 在我的应用程序中打开另一个应用程序?

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

您是否尝试过使用 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");
    }
}

或者

Device.OpenUri(new Uri("fb://page/page_id"));

Device.OpenUri(new Uri("twitter://user?user_id=userid"))

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM