【问题标题】:How to create a image picker on Xamarin Forms?如何在 Xamarin Forms 上创建图像选择器?
【发布时间】:2020-03-19 00:08:20
【问题描述】:

有人知道是否可以制作这样的图像选择器:

我试过以下插件:

https://github.com/jamesmontemagno/MediaPlugin

https://github.com/matheusneder/Xamarin.Forms.ImagePicker

我不想创建能够执行每个操作的按钮,我想要的是通过单个按钮来建议使用哪个应用程序。这可能吗?

谢谢。

【问题讨论】:

    标签: xamarin xamarin.forms plugins camera gallery


    【解决方案1】:

    您可以通过 xf 依赖服务在 Android 上使用 Intent.SetComponent:

    Xf:

    public interface IShare
    {
        void Share();
    }
    

    安卓:

    [assembly: Dependency(typeof(ShareImage))]
    namespace AndroidShareSample.Droid
    {
        public class ShareImage : Activity, IShare
        {
            public void Share()
            {
                var appPackageName = "com.sample.app";
                var intent = new Intent(Intent.ActionPick, Android.Provider.MediaStore.Images.Media.ExternalContentUri);
                var resInfos = CrossCurrentActivity.Current.Activity.PackageManager.QueryIntentActivities(intent,0);
                intent.SetComponent(new ComponentName(appPackageName, resInfos.FirstOrDefault(x=> x.ActivityInfo.PackageName == appPackageName).ActivityInfo.Name));
                Forms.Context.StartActivity(Intent.CreateChooser(intent, "Select Image"));
            }
        }
    }
    

    【讨论】:

      【解决方案2】:

      如果你想从手机的图片库中挑选一张照片,由于Xamarin.Forms不包含这个功能,需要使用DependencyService来访问各个平台的原生API。

      创建接口: 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/

      【讨论】:

      • 当你在服务中有一个 MainActivity 实例时,这将如何作为服务工作?如果您想在应用中的多个位置使用此服务怎么办?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-06-01
      • 1970-01-01
      • 1970-01-01
      • 2019-03-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多