web-dev-qa-db-ja.com

MediaPlayer-Java.io.FileNotFoundException:コンテンツプロバイダーがありません

私はかなり長い間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を拡張するクラスのインスタンスへの参照です。

何か案は?

6

おそらく、currentTrackにはFileオブジェクトがあります。その場合、Uri.parse(currentTrack.getPath())currentTrack.getUri()に置き換えます。ここで、getUri()を実装して、FileUri.fromFile()の値を返します。 。

これにより、差し迫った問題が解決されます。つまり、スキームがないため、無効なUriが作成されます。また、将来必要になる可能性のあるファイルではないUriタイプ(たとえば、contentUri値)を処理するように設定します。

1
CommonsWare

この問題は、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);