2017-09-06 1 views
0

J'ai écrit un lecteur mp3 pour un certain temps, mais pour une raison quelconque cette exception:MediaPlayer - java.io.FileNotFoundException: Aucun fournisseur de contenu

W/MediaPlayer: Impossible d'ouvrir/stockage/émulé/0/musique/musique générique de file.mp3: java.io.FileNotFoundException: Aucun fournisseur de contenu: /stockage/émulé/0/musique/musique générique file.mp3

ne cesse d'apparaître à chaque fois J'essaie de jouer n'importe quelle chanson.

La façon dont je récupère chemin une chanson est:

file.getAbsolutePath() 

fichier est une instance de fichier. Et la façon dont je joue la chanson est:

try { 
    mediaPlayer = MediaPlayer.create(this, Uri.parse(currentTrack.getPath())); 
    mediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() { 
     @Override 
     public void onCompletion(MediaPlayer mediaPlayer) { 
      nextTrack(); 
     } 
    }); 
} catch (Exception ex) { 
    ex.printStackTrace(); 
} 

ce est une référence à une instance d'une classe qui étend service.

Des idées?

+0

Exécutez-vous Nougat ou supérieur sur votre application? –

Répondre

0

Vraisemblablement, currentTrack a un objet File. Si c'est le cas, remplacez Uri.parse(currentTrack.getPath()) par currentTrack.getUri(), où vous implémentez getUri() pour renvoyer la valeur de Uri.fromFile() pour File.

Cela résout votre problème immédiat, à savoir que vous avez créé un Uri non valide, car il n'a pas de schéma. Il vous configure également pour traiter les types Uri qui ne sont pas des fichiers (par exemple, les valeurs contentUri) dont vous pourriez avoir besoin dans le futur.

+0

Merci, cela a résolu le problème! –

1

Ce problème se produit dans Nougat ou version supérieure si vous utilisez nougat ou une version supérieure, vous devez utiliser Content Provider.

Créer un fichier XML (par exemple file_provider_paths.xml) dans le dossier des ressources XML:

<paths xmlns:android="http://schemas.android.com/apk/res/android"> 
    <files-path name="shared" path="shared/"/> 
</paths> 

définir maintenant un fournisseur dans votre ApplicationManifest.xml, ajoutez ce fournisseur noeud intérieur de l'application:

<provider 
    android:name="android.support.v4.content.FileProvider" 
    android:authorities="<your provider authority>" //com.domainname.appname.fileprovider 
    android:exported="false" 
    android:grantUriPermissions="true"> 
    <meta-data 
     android:name="android.support.FILE_PROVIDER_PATHS" 
     android:resource="@xml/file_provider_paths"/> 
</provider> 

Obtenez maintenant l'URI du fichier partagé et utilisez-le dans votre application là où vous en avez besoin.

Uri sharedFileUri = FileProvider.getUriForFile(this, <your provider auhtority>, sharedFile);