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()
où 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();
}
où this est une référence à une instance d'une classe, qui étend Service .
Des idées?
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 content
Uri
) dont vous pourriez avoir besoin à l'avenir.
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);