来自Xamarin表单的android媒体选择器

来自Xamarin表单的android媒体选择器,xamarin,xamarin.forms,Xamarin,Xamarin.forms,我正在用xamarin表单为iOS和Android编写一个应用程序 我想从图片库中挑选一张照片 我已经创建了一个特定于android的静态助手: var i = new Intent(); i.SetType("*/*"); Forms.Context.StartActivity(Intent.CreateChooser(i, "")); 但我没有办法得到选定的图片字节。 我在android教程上看到过我应该在ActivityResult上实现的,但我不是在活动上,这是一个特定的静态调用 通过

我正在用xamarin表单为iOS和Android编写一个应用程序

我想从图片库中挑选一张照片

我已经创建了一个特定于android的静态助手:

var i = new Intent();
i.SetType("*/*");
Forms.Context.StartActivity(Intent.CreateChooser(i, ""));
但我没有办法得到选定的图片字节。 我在android教程上看到过我应该在ActivityResult上实现的,但我不是在活动上,这是一个特定的静态调用


通过表单的依赖项服务感谢您:

  • 创建依赖接口(
    IMedipicker
  • 创建一个活动子类(
    MediaChooseSactivityProxy
    ),它将充当您的
    意图。ActionPick
    代理
  • Xamarin.Android
    实现的
    imedipicker
    中,使用
    AutoResetEvent
    将Android
    StartActivityForResult
    /
    OnActivityResult
    回调转换为可等待的同步流
依赖服务交互: 注意:如果需要,可以在MainActivity/FormsAppCompatActivity上实现此操作,以避免此附加活动

用法:
var filePath=wait DependencyService.Get().ChooseAFileAsync();
System.Diagnostics.Debug.WriteLine(文件路径);

为什么不使用媒体插件?如果不实现OnActivityResult,就无法获得图像。正如Jason所建议的,您应该使用James Montemagno的插件:)我想了解它是如何工作的我在运行时得到这个异常:Android.Content.ActivityNotFoundException MediaChooseActivityProxy};您是否已在AndroidManifest.xml中声明了此活动,但我将其放在了清单中:@Bob5421将其从清单中删除,并向
MediaChooseActivityProxy
类添加
属性,即
[activity(Label=“MediaChooseActivityProxy”)]
现在,我对路径propertystore.forms的访问权限异常denied@Bob5421不确定,但请查看以下内容:
public interface IMediaPicker
{
    Task<string> ChooseAFileAsync();
}
public class MediaPicker : IMediaPicker
{
    public static string filePickedPath;
    public static AutoResetEvent waitHandle;

    public async Task<string> ChooseAFileAsync()
    {
        waitHandle = new AutoResetEvent(false);
        filePickedPath = "";
        Forms.Context.StartActivity(typeof(MediaChooserActivityProxy));
        await Task.Run(() => waitHandle.WaitOne());
        return filePickedPath;
    }
}
public class MediaChooserActivityProxy : Activity
{
    const string mimeType = "image/*";
    protected override void OnCreate(Bundle savedInstanceState)
    {
        base.OnCreate(savedInstanceState);
        var intent = new Intent(Intent.ActionPick);
        intent.SetType(mimeType);
        if (Build.VERSION.SdkInt >= BuildVersionCodes.Kitkat)
        {
            intent.PutExtra(Intent.ExtraMimeTypes, mimeType);
        }
        StartActivityForResult(Intent.CreateChooser(intent, "StackOverflow"), 73);
    }

    protected override void OnActivityResult(int requestCode, Result resultCode, Intent data)
    {
        if (requestCode == 73)
            if (resultCode == Result.Ok)
            {
                string[] filePathColumn = { MediaStore.Images.ImageColumns.Data };
                var cursor = ContentResolver.Query(data.Data, filePathColumn, null, null, null);
                cursor.MoveToFirst();
                var colummIndex = cursor.GetColumnIndex(filePathColumn[0]);
                MediaPicker.filePickedPath = cursor.GetString(colummIndex);
            }
        MediaPicker.waitHandle.Set();
        Finish();
    }
}
var filePath = await DependencyService.Get<IMediaPicker>().ChooseAFileAsync();
System.Diagnostics.Debug.WriteLine(filePath);