2017-09-15 6 views
0

je reçois une chanson de la bibliothèque de l'utilisateur comme ceci:copie audio de uri dans le répertoire spécifique

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

et récupérer comme ceci:

@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 
      } 
     } 
    } 

Je dois importer dans un dossier I défini et créé comme ceci:

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

J'ai essayé comme cela comme suggéré par Commonsware mais le fichier est pas créé:

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(); 
     } 
    } 
} 

Le fichier n'existe pas cependant. Comment puis-je réparer cela?

Répondre

1

Le fichier n'est pas là si

Très probablement, vous avez une trace de pile dans LogCat. song.getPath() est peu susceptible d'être utile. song n'a probablement pas un schéma file, et donc getPath() est sans signification.

Utilisez ContentResolver et openInputStream() pour obtenir un InputStream sur song, utilisez alors que InputStream pour copier le contenu.

aussi:

+0

Merci pour la réponse, je vais le faire en utilisant 'InputStream '. Juste par curiosité, à quoi sert la méthode 'getPath()' dans l'objet 'Uri'? Basé également sur les autres questions ici sur SO, il me semble que c'est une méthode vraiment déroutante et je n'arrive toujours pas à comprendre comment et quand l'utiliser. Merci aussi pour l'astuce de l'indixe qui va être utile et je ne le savais pas – Daniele

+0

@Daniele: "Juste par curiosité, à quoi sert la méthode getPath() dans l'objet Uri?" - si le schéma est 'fichier', il s'agit d'un chemin de système de fichiers. Si le schéma est autre chose, c'est une série de caractères dont la signification est opaque pour vous. Par exemple, 'https: // stackoverflow.com/questions/46241361/android-copy-audio-from-uri-to-specific-directory/46241452' est un' Uri'. Son schéma est 'https'. Son chemin est '/ questions/46241361/android-copy-audio-from-uri-to-specific-directory/46241452', et ce n'est qu'une série de caractères qui n'a aucun sens pour votre application. – CommonsWare

+0

oh je vois, merci pour la clarification – Daniele