2017-02-07 17 views
0

私は画像をアップロードするために以下のコードを使用しています。画像を取り込むときにアプリがクラッシュする

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

アプリがクラッシュした場合は、スタックトレースやその他の関連情報を追加してください。 – Cheesebaron

+0

デバッガを追加し、アプリケーションがクラッシュしている行をチェックします。 –

+0

あなたのコードはPlugin.Media、Version = 2.6.2.0で動作します.LocalPathLableはラベル、FileImageはImage、_mediaFileはクラス –

答えて

0

クロスメディアプラグインは、既存の写真コードをアップロードしても動作することはありませんでした。代わりに、ネイティブギャラリー選択を実装するために依存性注入を使用しました。 URLを取得したら、イメージビューに貼り付けるか、ネイティブコードでビットマップなどで膨らませることができます。私は実際にModel.Photoに写真の名前とバイト[]を渡しますが、それはあなた次第です。

PCL

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

アンドロイド

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はGoogleだけよりもはるかに簡単です。

+0

のメンバーとして定義されていると仮定しています。コードはEXIFローテーションを考慮しないため、一部のデバイスでは回転する可能性があります。 CrossMediaプラグインがうまくいきます。少なくとも最後のバージョン。私は古いバージョンでも問題を抱えていました。 – xleon

+0

合意。免責事項*このソリューションを貼り付けてコピーすることはできません。実際には、この出発点と併せてアンドロイド/アイオスのコーディングについて学ぶ必要があります。 –

関連する問題