2017-09-15 5 views
0

ich ein Lied aus der Bibliothek des Benutzers wie folgt aus:Kopieren von Audio von uri zu bestimmten Verzeichnis

Intent selectIntent = new Intent(Intent.ACTION_GET_CONTENT); 
      selectIntent.setType("audio/*"); 
      startActivityForResult(selectIntent, SONG_REQUEST_CODE); 

und abrufen es wie folgt aus:

@Override 
    public void onActivityResult(int requestCode, int resultCode, Intent data) { 
     super.onActivityResult(requestCode, resultCode, data); 
     if (requestCode == SONG_REQUEST_CODE && resultCode == Activity.RESULT_OK) { 
      if ((data != null) && (data.getData()!=null)) { 
       song = data.getData(); //song is an Uri defined previuosly 
      } 
     } 
    } 

ich es in einen Ordner ich importieren müssen definiert und erstellt wie folgt aus:

final File dir2 = new File(Environment.getExternalStorageDirectory().getAbsolutePath() + "/Chords/Imported Audio"); 
dir2.mkdirs(); 

ich so versucht wie Commonsware vorgeschlagen, aber die Datei nicht erstellt wird:

private void importAudio(Uri uri) { 
    String source = uri.getPath(); 
    String destinationFile = dir2 + File.separator + songName; 

    BufferedInputStream bis = null; 
    BufferedOutputStream bos = null; 

    try { 
     bis = new BufferedInputStream(new FileInputStream(source)); 
     bos = new BufferedOutputStream(new FileOutputStream(destinationFile, false)); 

     byte[] buf = new byte[1024]; 
     bis.read(buf); 
     do { 
      bos.write(buf); 
     } while (bis.read(buf) != -1); 

    } catch (IOException e) { 
     e.printStackTrace(); 
    } finally { 
     try { 
      if (bis != null) bis.close(); 
      if (bos != null) bos.close(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 
} 

Die Datei ist jedoch nicht da. Wie kann ich das beheben?

Antwort

1

Die Datei ist es allerdings nicht

Wahrscheinlich haben Sie einen Stack-Trace in LogCat. song.getPath() ist wahrscheinlich nicht nützlich. song hat wahrscheinlich kein file Schema, und so ist getPath() bedeutungslos.

Verwenden ContentResolver und openInputStream() ein InputStream auf song zu bekommen, verwenden Sie dann, dass InputStream den Inhalt zu kopieren.

auch:

gesehen werden kann
+0

Danke für die Antwort, ich werde tun, um diese mit 'Input '. Nur aus Neugier, was ist die 'getPath()' Methode im 'Uri' Objekt eigentlich nützlich? Basierend auf den anderen Fragen hier auf SO, scheint es mir, da es eine wirklich verwirrende Methode ist und ich immer noch nicht herausfinden kann, wie und wann ich es benutzen soll. Danke auch für den Indixing-Tipp wird es nützlich sein und ich wusste es nicht – Daniele

+0

@Daniele: "Nur aus Neugier, was ist die Methode getPath() im Uri-Objekt eigentlich nützlich?" - Wenn das Schema "Datei" ist, ist es ein Dateisystempfad. Wenn das Schema etwas anderes ist, ist es eine Reihe von Zeichen, deren Bedeutung für Sie undurchsichtig ist. Zum Beispiel ist "https: // stackoverflow.com/questions/46241361/android-copy-audio-from-uri-to-specific-directory/46241452" ein 'Uri'. Sein Schema ist "https". Der Pfad ist '/ questions/46241361/android-copy-audio-from-uri-to-specific-directory/46241452', und das ist nur eine Reihe von Zeichen, die keine Bedeutung für Ihre App hat. – CommonsWare

+0

oh ich sehe, danke für die Klarstellung – Daniele

Verwandte Themen