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

Posted

技术标签:

【中文标题】Xamarin Forms:如何从另一个应用程序打开一个应用程序?【英文标题】:Xamarin Forms: How to open an app from another app? 【发布时间】:2020-12-15 01:20:00 【问题描述】:

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

我已经按照thread进行了如下尝试:

在视图中

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

    对于 android,我在运行项目时收到 System.NullReferenceException: 'Object reference not set to an instance of an object.'。我不知道代码中的应用名称是什么?我已经尝试过使用包名。

    另外如果设备上没有安装安卓应用,需要打开Play Store下载应用。

    我没有测试 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?

【问题讨论】:

【参考方案1】:

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。

【讨论】:

这是您设备上 google play store(或其他应用商店)的包名。你需要检查一下。 Device.OpenUri(new Uri("xxx")) 我在 ios 应用程序中遇到了相同功能的问题。你能看看吗? ***.com/questions/63751993/…【参考方案2】:

您是否尝试过使用 Xamarin Essentials: Xamarin.Essentials: Launcher

   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"))

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

【讨论】:

仅供参考,此答案适用于 URI 端点,与启动另一个 apk 不同 @DukeDidntNukeEm 这是 APK 的,如果你想打开一个浏览器,你可以使用下面的代码 await Browser.OpenAsync(uri, BrowserLaunchMode.SystemPreferred); 谢谢!也许我很困惑,我认为一个 URI 调用了一个 apk,但是要在代码中直接调用一个 apk,你必须以不同于这里的答案的方式来做 - 这有意义吗?比如说,你想打开谷歌地图,但不是从可点击的位置或其他东西开始,只是加载谷歌地图 apk :)

以上是关于Xamarin Forms:如何从另一个应用程序打开一个应用程序?的主要内容,如果未能解决你的问题,请参考以下文章

Xamarin Forms - 在页面打开时填充自定义控件

Xamarin.Forms 无法通过 ViewModel 将 ObservableCollection 绑定到 CollectionList

Xamarin.Forms:如何在 Xamarin.Forms 跨平台项目中开发具有蓝牙连接的应用程序?

Prism for Xamarin Forms - 从标签页导航

如何使用 Xamarin.Forms.Maps(无 Xamarin.Forms.GoogleMaps)在地图中应用样式或更改颜色

如何在 Xamarin.Forms 中获取/检测屏幕大小?