2016-06-10 11 views
0

OK. Ich ziehe mir die Haare aus. Ich verwende den folgenden Code, um einen FTP-Upload eines vom Benutzer ausgewählten Fotos zu erstellen.Lokalen Speicherpfad für ein Bild von "Inhalt:" basierend erhalten Uri

  using (WebClient client = new WebClient()) 
      { 
       client.Credentials = new NetworkCredential("[username]", "[password]"); 
       client.UploadFile("XXXXXXXXXX" + destinationName, "STOR", sourceFile); 
      } 

Dies ist eine Standard-.NET-Implementierung. Das Problem ist dann Quelldatei. Ich habe ein Click-Event, zusammen mit einem Return-Event von.

protected override void OnActivityResult(int requestCode, Result resultCode, Intent data) 
    { 
     if ((requestCode == PickImageId) && (resultCode == Result.Ok) && (data != null)) 
     { 

     } 
    } 

Hier ist das Problem, das mich verrückt macht. Ich benötige den physischen Pfad des ausgewählten Fotos, das vom OnActiveResult-Ereignis zurückgegeben wurde, damit das FTP ordnungsgemäß hochgeladen wird.

Ich habe es versucht;

Android.Net.Uri uri = data.Data; 
physicalAddress = Convert.ToString(data.Data); 
physicalAddress = Convert.ToString(uri); 

Keines dieser Rückkehr der Pfad nur „Inhalt: \ android.provider.media \ Dokumente \ document \ image% 123.164“

diese Einstellung, wenn die Funktion oben vorgesehen, einen Fehler zurück als vorgesehen Quelldatei existiert nicht.

Haare herausziehen! bitte hilfe!

+0

Mögliches Duplikat [android realen Weg erhalten, indem Uri.getPath()] (http://stackoverflow.com/questions/2789276/android-get-real-path-by-uri-getpath) – Gusman

+0

I versuchte alles in diesem Thread .. Nichts scheint zu funktionieren .. – user3516183

Antwort

0

Hier ist ein vollständiges Beispiel zum Extrahieren eines vollständigen Pfads aus einem Image-basierten Uri.

Hinweis: Dies funktioniert mit KitKit und höher.

[Activity(Label = "FilePathFromContentURI", MainLauncher = true, Icon = "@mipmap/icon")] 
public class MainActivity : Activity 
{ 
    protected override void OnCreate(Bundle savedInstanceState) 
    { 
     base.OnCreate(savedInstanceState); 
     SetContentView(Resource.Layout.Main); 
     Button button = FindViewById<Button>(Resource.Id.myButton); 
     button.Click += delegate { 
      Intent intent = new Intent(); 
      intent.SetType("image/*"); 
      intent.SetAction(Intent.ActionGetContent); 
      StartActivityForResult(Intent.CreateChooser(intent, "Select Image"), 1); 
     }; 
    } 

    protected override void OnActivityResult(int requestCode, Result resultCode, Intent data) 
    { 
     base.OnActivityResult(requestCode, resultCode, data); 

     ICursor cursor = null; 
     try 
     { 
      // assuming image 
      var docID = DocumentsContract.GetDocumentId(data.Data); 
      var id = docID.Split(':')[1]; 
      var whereSelect = MediaStore.Images.ImageColumns.Id + "=?"; 
      var projections = new string[] { MediaStore.Images.ImageColumns.Data }; 
      // Try internal storage first 
      cursor = ContentResolver.Query(MediaStore.Images.Media.InternalContentUri, projections, whereSelect, new string[] { id }, null); 
      if (cursor.Count == 0) 
      { 
       // not found on internal storage, try external storage 
       cursor = ContentResolver.Query(MediaStore.Images.Media.ExternalContentUri, projections, whereSelect, new string[] { id }, null); 
      } 
      var colData = cursor.GetColumnIndexOrThrow(MediaStore.Images.ImageColumns.Data); 
      cursor.MoveToFirst(); 
      var fullPathToImage = cursor.GetString(colData); 
      Log.Info("MediaPath", fullPathToImage); 
     } 
     catch (Error err) 
     { 
      Log.Error("MediaPath", err.Message); 
     } 
     finally 
     { 
      cursor?.Close(); 
      cursor?.Dispose(); 
     } 
    } 
}