私はかなり長い間mp3プレーヤーを書いてきましたが、何らかの理由でこの例外が発生しました:
W/MediaPlayer:/ storage/emulated/0/Music/generic music file.mp3を開けませんでした:Java.io.FileNotFoundException:No content provider:/ storage/emulated/0/Music/generic music file.mp3
anyの曲を再生しようとするたびにポップアップし続けます。
曲へのパスを取得する方法は次のとおりです。
file.getAbsolutePath()
ここでfileはFileインスタンスです。そして私が曲を演奏する方法は:
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は、Serviceを拡張するクラスのインスタンスへの参照です。
何か案は?
おそらく、currentTrack
にはFile
オブジェクトがあります。その場合、Uri.parse(currentTrack.getPath())
をcurrentTrack.getUri()
に置き換えます。ここで、getUri()
を実装して、File
のUri.fromFile()
の値を返します。 。
これにより、差し迫った問題が解決されます。つまり、スキームがないため、無効なUri
が作成されます。また、将来必要になる可能性のあるファイルではないUri
タイプ(たとえば、content
Uri
値)を処理するように設定します。
この問題は、nougat以降のバージョンを使用している場合にNougat以降のバージョンで発生するContent Provider
。
XMLリソースフォルダーにXMLファイル(file_provider_paths.xmlなど)を作成します。
<paths xmlns:Android="http://schemas.Android.com/apk/res/Android">
<files-path name="shared" path="shared/"/>
</paths>
次に、ApplicationManifest.xmlでプロバイダーを定義し、このプロバイダーをアプリケーションノード内に追加します。
<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>
共有ファイルのURIを取得し、必要なアプリケーションで使用します。
Uri sharedFileUri = FileProvider.getUriForFile(this, <your provider auhtority>, sharedFile);