如何解决xamarin android 图像选择器 - 无法获取路径
当我打开图库并转到 Dropbox 或一个驱动器时,我收到一条无法获取路径的消息,但是当我转到 google 照片或本地时,我得到了要加载到网格中的正确图像。
DependencyService.Get<IMediaService>().OpenGallery();
MessagingCenter.Unsubscribe<App,List<string>>((App)Xamarin.Forms.Application.Current,"ImagesSelectedAndroid");
MessagingCenter.Subscribe<App,"ImagesSelectedAndroid",(s,images) =>
{
if (images.Count > 0)
{
Console.WriteLine($"Processed {images.Count} images");
UploadToBlob(images);
GetGallery();
}
public void OpenGallery()
{
try
{
var imageIntent = new Intent(Intent.ActionPick);
imageIntent.SetType("image/*");
imageIntent.PutExtra(Intent.ExtraAllowMultiple,true);
imageIntent.SetAction(Intent.ActionGetContent);
((Activity)CrossCurrentActivity.Current.Activity).StartActivityForResult(Intent.CreateChooser(imageIntent,"Select photo"),Opengallerycode);
Toast.MakeText(CrossCurrentActivity.Current.Activity,"Tap and hold to select multiple photos.",ToastLength.Short)?.Show();
}
catch (Exception ex)
{
Console.WriteLine(ex.ToString());
Toast.MakeText(CrossCurrentActivity.Current.Activity,"Error. Can not continue,try again.",ToastLength.Long)?.Show();
}
}
解决方法
您可以将图像从 Dropbox 或一个驱动器流式传输并加载到网格中。
创建界面: IPhotoPickerService.cs
public interface IPhotoPickerService
{
Task<Stream> GetImageStreamAsync();
}
Android 实现:
MainActivity.cs
public class MainActivity : global::Xamarin.Forms.Platform.Android.FormsAppCompatActivity
{
internal static MainActivity Instance { get; private set; }
... ...
// Field,property,and method for Picture Picker
public static readonly int PickImageId = 1000;
public TaskCompletionSource<Stream> PickImageTaskCompletionSource { set; get; }
protected override void OnActivityResult(int requestCode,Result resultCode,Intent intent)
{
base.OnActivityResult(requestCode,resultCode,intent);
if (requestCode == PickImageId)
{
if ((resultCode == Result.Ok) && (intent != null))
{
Android.Net.Uri uri = intent.Data;
Stream stream = ContentResolver.OpenInputStream(uri);
// Set the Stream as the completion of the Task
PickImageTaskCompletionSource.SetResult(stream);
}
else
{
PickImageTaskCompletionSource.SetResult(null);
}
}
}
}
PhotoPickerService.cs
public class PhotoPickerService : IPhotoPickerService
{
public Task<Stream> GetImageStreamAsync()
{
// Define the Intent for getting images
Intent intent = new Intent();
intent.SetType("image/*");
intent.SetAction(Intent.ActionGetContent);
// Start the picture-picker activity (resumes in MainActivity.cs)
MainActivity.Instance.StartActivityForResult(
Intent.CreateChooser(intent,"Select Photo"),MainActivity.PickImageId);
// Save the TaskCompletionSource object as a MainActivity property
MainActivity.Instance.PickImageTaskCompletionSource = new TaskCompletionSource<Stream>();
// Return Task object
return MainActivity.Instance.PickImageTaskCompletionSource.Task;
}
}
有关IOS、UWP实现照片选择器的更多信息,您可以查看MS文章。 https://docs.microsoft.com/en-us/xamarin/xamarin-forms/app-fundamentals/dependency-service/photo-picker
并从链接下载源文件。 https://docs.microsoft.com/zh-cn/samples/xamarin/xamarin-forms-samples/dependencyservice/
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。