我使用以下代码上传图片。
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;
});
}
在选择图像后,应用程序突然崩溃。
答案 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)在值输入下,当他/她被问及是否允许应用访问照片库时,要显示给用户的字符串。
在我这样做之后,应用程序从库中选择了一张照片后停止了崩溃。它要求我给应用程序权限一次,之后工作正常。