2016-06-15 8 views
0

このアクティビティの開始時にローカルURIから画像を表示しようとしています。Xamarin.Android - エンコードされた文字列を解析した後、「不良ビットマップURIで解決URIが失敗しました」

ユーザが画像を選択し、OnActivityResult()メソッドをトリガします。私は最初のURIを取得する場合、それは問題なく画像が表示されます。

protected override void OnActivityResult(int requestCode, Result resultCode, Intent data) 
{ 
    if (requestCode == IMG_REQUEST_CODE && resultCode == Result.Ok) 
    { 
     Android.Net.Uri imageUri = null; 
     if (data != null) 
     { 
      imageUri = data.Data; 
      userPreferences.BackgroundImageURI = imageUri.ToString(); 
      imgView.SetImageURI(imageUri); 
      imgView.Visibility = ViewStates.Visible; 
     } 
    } 
} 

あなたが見ることができるように、私はuserPreferencesでエンコードされた文字列としてURIを格納しています。これはデバイスに保存され、問題なくロードできます。この場合、文字列はcontent://com.android.providers.media.documents/document/image%3A38であり、(共有設定を使用して)メモリからロードすると同じです。

コード化されたURI文字列を読み込み、文字列を解析してURIを作成し、その画像を表示するためにURIをimgViewに設定するコードです。

protected override void OnCreate(Bundle bundle) 
{ 
    base.OnCreate(bundle); 
    SetContentView(Resource.Layout.Preferences); 

    userPreferences = Helpers.LoadUserPreferences(this, new Shared.Model.UserPreferences()); 

    imgView = FindViewById<ImageView>(Resource.Id.imgView); 
    if (!string.IsNullOrWhiteSpace(userPreferences.BackgroundImageURI)) 
    { 
     var imgURI = Android.Net.Uri.Parse(userPreferences.BackgroundImageURI); 
     imgView.SetImageURI(imgURI); 
     imgView.Visibility = ViewStates.Visible; 
    } 
    else 
    { 
     imgView.Visibility = ViewStates.Invisible; 
    } 
} 

それはSetView(imgUri)ラインになると、私はこの出力を受け取る:resolveUri failed on bad bitmap uri: content://com.android.providers.media.documents/document/image%3A38

私も無駄にURIをハードコーディング試してみました。主な不満は、コードが同じで、2つの異なるシナリオで実行されていることです。アクティビティのライフサイクルと関係している可能性はありますか?それとも私はもっと大きなものを逃したのですか?私はURIから画像のため実際のパスを取得するクラスを持つ代替として

if (!string.IsNullOrWhiteSpace(userPreferences.BackgroundImageURI)) 
{ 
    var imgURI = Android.Net.Uri.Parse(userPreferences.BackgroundImageURI); 
    var input = Activity.ContentResolver.OpenInputStream(imgURI); 
    imgView.SetImageBitmap(BitmapFactory.DecodeStream(input)); 
    imgView.Visibility = ViewStates.Visible; 
} 
else 
{ 
    imgView.Visibility = ViewStates.Invisible; 
} 

+0

OnActivityResultに来た画像がギャラリーからでしょうか? – jzeferino

+0

@jzeferinoそれは正しいです。 –

答えて

1

はこれを試してみてください。たとえば、そのパスにCropActivityを指定するとよいでしょう。

クラスはhereからダウンロードできます。

そして、このようにそれを使用します。

if (!string.IsNullOrWhiteSpace(userPreferences.BackgroundImageURI)) 
{ 
    var imgURI = Android.Net.Uri.Parse(userPreferences.BackgroundImageURI); 
    imgView.SetImageURI (Uri.Parse(PathUtils.PathUtils.GetPath(Activity, imgURI))); 
    imgView.Visibility = ViewStates.Visible; 
} 
else 
{ 
    imgView.Visibility = ViewStates.Invisible; 
} 
+0

これは実際には完全に機能しました!私はそれを完全に理解しているかどうかはわかりません。したがって、上の 'Intent data'から返されたURIは真のパスではありませんか?それは何かが異なっていたので、その文脈でのみ機能しましたか? –

+0

このメソッドは、ディスクからのファイルの実際のパスを取得しますが、これは私が通常使用するソリューションです。 – jzeferino

関連する問題