在开始本文之前,建议先了解 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 实现首先需要在设备上临时保存图片,然后使用 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());
以下是 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