Xamarin.Forms 跨平台移动应用开发

在开始本文之前,建议先了解 Xamarin.Forms、依赖服务(Dependency Service)、Xamarin.Android 和 Xamarin.iOS 的基础知识。这将有助于更好地理解项目的流程。

使用代码

本文将展示如何在 Android 和 iOS 两个客户端上实现功能。将使用 Xamarin.Portable 来实现依赖服务,以便为不同的客户端提供不同的实现方式。以下是使用的接口:

public interface IShareImage { Task Share(string url); }

在 XAML 页面中,添加以下 ToolBarItem,并关联一个 Command:

var share = new ToolbarItem { Text = "Share", Command = new Command(async () => { try { await DependencyService.Get().Share("Your Media Link"); } catch (Exception ex) { Console.WriteLine(ex); await DisplayAlert("Error", "Something went wrong. Please try again later", "OK"); } }) }; ToolbarItems.Add(share);

Android实现

Android 实现首先需要在设备上临时保存图片,然后使用 Intent 进行分享。为了使这个流程工作,用户需要在移动设备的设置中允许应用的权限。

在设备上临时保存图片:

var path = Android.OS.Environment.GetExternalStoragePublicDirectory("Temp"); if (!File.Exists(path.Path)) { Directory.CreateDirectory(path.Path); } string absPath = path.Path + "/tempfile.jpg"; File.WriteAllBytes(absPath, GetBytes(url));

创建 Intent 来分享图片:

var _context = Android.App.Application.Context; Intent sendIntent = new Intent(global::Android.Content.Intent.ActionSend); sendIntent.PutExtra(global::Android.Content.Intent.ExtraText, "Application Name"); sendIntent.SetType("image/*"); sendIntent.PutExtra(Intent.ExtraStream, Android.Net.Uri.Parse("file://" + absPath)); _context.StartActivity(Intent.CreateChooser(sendIntent, "Sharing"));

为了使应用正常工作,需要在 AndroidManifest.XML 中添加以下权限:

<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

如果 targetSdkVersion >= 24,则需要使用 FileProvider 类来为其他应用提供对特定文件或文件夹的访问权限。以下是在 MAINACTIVITY.CS 类中添加的代码:

StrictMode.VmPolicy.Builder builder = new StrictMode.VmPolicy.Builder(); StrictMode.SetVmPolicy(builder.Build());

iOS 实现

以下是 Xamarin.iOS 上 IShareImage 的实现:

var imgSource = ImageSource.FromUri(new Uri(url)); var handler = new ImageLoaderSourceHandler(); var uiImage = await handler.LoadImageAsync(imgSource); var img = NSObject.FromObject(uiImage); var mess = NSObject.FromObject("App Name"); var activityItems = new[] { mess, img }; var activityController = new UIActivityViewController(activityItems, null); var topController = UIApplication.SharedApplication.KeyWindow.RootViewController; while (topController.PresentedViewController != null) { topController = topController.PresentedViewController; } topController.PresentViewController(activityController, true, () => { }); Privacy - Photo Library Additions Usage Description
沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485