android - Xamarin 表单 : How to open an app from another app?

标签 android ios xamarin.forms uwp

我有 2 个使用 Xamarin.Forms 开发的应用程序(A 和 B)。我需要从应用 B 打开应用 A。
我已经按照这个 thread 尝试如下:
在 View

var appname = @"otherappId";
var result = await DependencyService.Get<IAppHandler>().LaunchApp(appname);
接口(interface)
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);
        }
    }
  • 对于 android,我得到 System.NullReferenceException: 'Object reference not set to an instance of an object.'运行项目时。我不知道代码中的应用名称是什么?我试过用包名。
  • 此外,如果设备上未安装 android 应用程序,则需要打开 Play 商店下载该应用程序。
  • 我没有测试 iOS 部分,因为 Mac 不可用。上面的代码适用于 iOS 吗?另外,如果 iPhone 上没有安装该应用程序,则需要打开 AppStore 下载该应用程序。
  • 另外,我喜欢为 UWP 实现相同的功能。

  • 引用:
    https://forums.xamarin.com/discussion/92666/detect-and-open-another-app-on-device
    Is it possible to open another app in my app with 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 .

    关于android - Xamarin 表单 : How to open an app from another app?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63594273/

    相关文章:

    c# - 从 iOS TabBar 移除着色

    c# - 如何在 Xamarin Forms 平台上点击 android 按钮时删除动画/阴影效果

    php - 连接 Android 应用程序以将字符串从 mysql 获取到 ListView 时出错

    ios - 将 subview 添加到 UITableViewCell

    ios - UITableViewController 内部 UINavigationController 和 UITabBarController 底部插入关闭

    ios - 我可以以编程方式更改应用程序图标吗

    c# - Xamarin 表单绑定(bind)。如何根据某些条件显示 3 个不同字符串中的 1 个

    android - Android 中的 GCM 消息数

    IntelliJ IDEA(或 Android Studio)的 Android 支持插件无法打开此项目

    android - Retrofit + RxJava 中的链接请求