android - 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);
}
}
对于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 是否可以使用 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。
推荐阅读
- ruby-on-rails - 我尝试通过ajax从rails中获取随机单个数据库?
- jquery - 通过 jquery ajax 调用外部 API 在控制台中出现“csp:blocked”错误
- ipc - 两个独立的进程是否可以共享文件的内存映射?
- machine-learning - 您知道哪些工具可用于存储、版本控制和部署为 ML 模型的 API 服务?
- r - R:更好的冲突()函数?
- asp.net-mvc - 通过淘汰赛更新剃须刀收藏
- python - Python - 如何将 1/0 转换为是/否(在 pandas.DataFrame 中)?
- android - 如何使用 Spring Boot Server 无限期地保持 Android 应用程序登录?
- netlogo - 未横向和纵向包裹时,海龟会卡在边缘
- firebase - auth 4.4.3 中缺少 Firebase.Auth.PlayGamesAuthProvider 类?