2017-05-23 12 views
0

So verwende ich Retrofit, um Bilder auf unseren Server hochzuladen, und verwende Galerieauswahl, um das Bild auszuwählen. Ich versuche, den Pfad des Bildes zu erhalten, weil uri.getPath() Datei nicht gefunden Exception zurückgibt. Ich habe buchstäblich fast jeden stackoverflow-Artikel zu diesem Thema gesehen und habe immer noch keine Antwort. Der folgende Code, den ich habe, ist ähnlich wie alles, was ich online gesehen habe, und es gibt IMMER null zurück, und ich habe keine Ahnung warum. BITTE HILFEDer Pfad zum URI ist immer null?

 @Override 
protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
    super.onActivityResult(requestCode, resultCode, data); 

    if (requestCode == PICK_IMAGE_REQUEST && resultCode == RESULT_OK && data != null && data.getData() != null) { 
     try { 
      android.net.Uri selectedImage = data.getData(); 

      Bitmap bitmap = MediaStore.Images.Media.getBitmap(getContentResolver(), selectedImage); 
      // Log.d(TAG, String.valueOf(bitmap)); 
      ImageView imageView = (ImageView) findViewById(R.id.expandedProfilePic); 
      imageView.setImageBitmap(bitmap); 

      String[] filePathColumn = {MediaStore.Images.Media.DATA}; 
      android.database.Cursor cursor = getContentResolver().query(selectedImage, filePathColumn, null, null, null); 
      if (cursor == null) 
       return; 

      cursor.moveToFirst(); 

      int columnIndex = cursor.getColumnIndex(filePathColumn[0]); 
      String filePath = cursor.getString(columnIndex); 
      cursor.close(); 

      // is always null 
      System.out.println("FILE PATH " + filePath); 

     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 
} 

Antwort

2

Ich versuche, den Pfad des Bildes zu erhalten, weil uri.getPath() zurückkehrt Ausnahme Datei nicht gefunden durch „Galerie Chooser“

Unter der Annahme, dass Sie meinen ACTION_GET_CONTENT oder möglicherweise ACTION_PICK, gibt es keinen Pfad, weil eine Uri keine Datei ist.

Ich habe buchstäblich fast jeden Stackoverflow Artikel zu diesem Thema

Nein, Sie haben nicht gesehen. Insbesondere haben lesen Sie nicht von den Dutzenden, die ich dazu beigetragen haben, wie this one oder this one oder this one oder this one oder this one oder this one oder this one oder this one oder this one oder this one oder this one oder this one oder this one. Und das sind nur von 2017.

Der folgende Code, ich muss alles ähnlich habe ich online gesehen

und dieser Code wird für die meisten Uri Werte nicht funktionieren.

ein ContentResolver und openInputStream() Verwenden Sie ein InputStream auf den Inhalt der Uri identifiziert zu bekommen. Im Idealfall würden Sie einfach die verwenden. Im Falle von Retrofit, obwohl ich noch nicht versucht habe, Inhalte hochzuladen, schätze ich, dass es auf einer Datei besteht. In diesem Fall verwenden Sie die InputStream und eine für eine Datei, die Sie steuern, um eine Kopie des Inhalts zu erstellen. Laden Sie dann die Kopie hoch und löschen Sie sie, wenn Sie fertig sind.

+0

Ich benutze ACTION_GET_CONTENT, auch ich habe Ihre anderen Stack-Überläufe, aber ich verstehe immer noch nicht, wie die Verwendung von Inputstream mir den Pfad des Fotos geben wird. Ich muss den Pfad angeben, um mit Retrofit hochladen zu können. – thatsnifty

+0

@thatsnifty: "Ich verstehe immer noch nicht, wie die Verwendung von inputstream mir den Weg des Fotos gibt" - weil ** es keinen Weg zum Foto gibt **, zumindest bis du eine Kopie dieses Inhalts machst , wie ich im letzten Absatz der Antwort behandle. Was lässt Sie glauben, dass das Foto immer eine Datei auf dem lokalen Dateisystem sein wird? Die Aktion lautet "ACTION_GET_CONTENT", nicht "ACTION_GET_FILE". Wenn Sie nicht damit umgehen können, dass ACTION_GET_CONTENT Dinge zurückgibt, die keine Dateien sind, verwenden Sie nicht mehr ACTION_GET_CONTENT. – CommonsWare

+0

ok, also hat es ein paar Tage gedauert, aber ich habe es endlich bekommen! Ich benutzte ACTION_PICK, inputstream und contentresolver. Ihre Antwort hat mir sehr geholfen! Und wer das gleiche Problem hat, ist auch ein gutes Beispiel: [link] https://inducesmile.com/android/android-upload-image-to-server-using-retrofit-2/ – thatsnifty