选择图像时应用程序崩溃

时间:2017-02-07 10:29:58

标签: xamarin xamarin.forms

我使用以下代码上传图片。

public async void btnAttachment_Tapped(object sender, EventArgs e)
{
    await CrossMedia.Current.Initialize();
    if (!CrossMedia.Current.IsPickPhotoSupported)
    {
        await DisplayAlert("Photos Not Supported", ":(Permission not granted to photos.", "OK");
        return;
    }

    _mediaFile = await CrossMedia.Current.PickPhotoAsync();

    if (_mediaFile == null)
        return;

    LocalPathLable.Text = _mediaFile.Path;

    FileImage.Source = ImageSource.FromStream(() =>
    {
        var stream = _mediaFile.GetStream();
        _mediaFile.Dispose();
        return stream;

    });
}

在选择图像后,应用程序突然崩溃。

2 个答案:

答案 0 :(得分:0)

我从未发现跨媒体插件上传现有的照片代码。相反,我使用依赖注入来实现本机库选择。获得网址后,您可以将其粘贴到图片视图中,或者将其作为位图或其他内容在您的本机代码中充气。我实际上使用照片的名称和byte []传回Model.Photo,但这取决于你。

<强> PCL

var x = await DependencyService.Get<IMedia>().UploadGallery();

<强>的Android

class Media_Android : Activity, IMedia
{
    public async Task<string> UploadGallery()
    {
            var activity = Forms.Context as MainActivity;

            Intent intent = new Intent();
            intent.SetType("image/*");
            intent.SetAction(Intent.ActionGetContent);


            var result = await activity.StartActivityForResultAsync(intent);

            if(result.Data != null)
            {
                Android.Net.Uri myUri = result.Data.Data;

                var getString = this.GetPathToImage(myUri);

                if (getString != null)
                {
                    return getString;
                }
                else
                {
                    return null;
                }
            }
            else
            {
                return null;
            }
    }
}

private string GetPathToImage(Android.Net.Uri uri)
{


        int currentapiVersion = (int)Android.OS.Build.VERSION.SdkInt; // Gets the Android version number for ex:- Lollipop 21-22, KitKat 19–20, JellyBean: 16-18.
        string path = "";
        // "KitKat 4.4(KitKat) and above compatible"
        if (currentapiVersion > (int)Android.OS.BuildVersionCodes.JellyBeanMr2)
        {
            Android.Database.ICursor cursor1 = Forms.Context.ContentResolver.Query(uri, null, null, null, null);
            cursor1.MoveToFirst();
            string document_id = cursor1.GetString(0);
            if(document_id.Contains(":"))
            {
                document_id = document_id.Split(':')[1];
            }
            cursor1.Close(); //Extract the ID from the URI

            cursor1 = Forms.Context.ContentResolver.Query(
            Android.Provider.MediaStore.Images.Media.ExternalContentUri,
            null, MediaStore.Images.Media.InterfaceConsts.Id + " = ? ", new System.String[] { document_id }, null);
            cursor1.MoveToFirst();
            path = cursor1.GetString(cursor1.GetColumnIndex(MediaStore.Images.Media.InterfaceConsts.Data));
            cursor1.Close(); //Query the device database, to get the Image based on the ID


        }



        //"JellyBean 4.1 - 4.3.1 (JellyBean) and below compatible"
        if (currentapiVersion <= (int)Android.OS.BuildVersionCodes.JellyBeanMr2)
        {
            System.String[] projection = new System.String[] { Android.Provider.MediaStore.MediaColumns.Data };
            contentResolver = Forms.Context.ContentResolver;
            Android.Database.ICursor cursor = contentResolver.Query(uri, projection, null, null, null);
            if (cursor != null && cursor.Count > 0)
            {
                cursor.MoveToFirst();
                int index = cursor.GetColumnIndex(Android.Provider.MediaStore.MediaColumns.Data);
                path = cursor.GetString(index);


            }
        }

        return path;

 }

<强>的iOS

它比Android更容易谷歌。

答案 1 :(得分:0)

我有同样的问题,我解决它的方式是这样的:

请注意,我只使用共享代码和IOS。实际上,如果您阅读插件自述文件,它会告诉您这样做,所以如果您对Android部分感兴趣,请阅读Android部分。

1)在IOS项目中转到info.plist 2)使用通用plist编辑器打开它。 3)添加自定义属性 4)选择名为&#34;隐私 - 照片库使用说明&#34; 5)在值输入下,当他/她被问及是否允许应用访问照片库时,要显示给用户的字符串。

在我这样做之后,应用程序从库中选择了一张照片后停止了崩溃。它要求我给应用程序权限一次,之后工作正常。