web-dev-qa-db-fra.com

MediaPlayer - Java.io.FileNotFoundException: aucun fournisseur de contenu

J'écris un lecteur mp3 depuis un certain temps, mais pour une raison quelconque, cette exception:

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

continue d'apparaître à chaque fois que j'essaie de jouer tout chanson.

La façon dont je récupère le chemin d'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();
}

this est une référence à une instance d'une classe, qui étend Service .

Des idées?

6
Andrej Korowacki

Vraisemblablement, currentTrack a un objet File. Si tel est le cas, remplacez Uri.parse(currentTrack.getPath()) par currentTrack.getUri(), où vous implémentez getUri() pour renvoyer la valeur de Uri.fromFile() pour le 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 permet également de gérer les types Uri qui ne sont pas des fichiers (par exemple, les valeurs contentUri) dont vous pourriez avoir besoin à l'avenir.

1
CommonsWare

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

Créez 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>

Maintenant, définissez un fournisseur dans votre ApplicationManifest.xml, ajoutez ce fournisseur dans le nœud d'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);
2