2017-09-06 17 views
0

私はかなりの時間のためのmp3プレーヤーを書いてきたが、いくつかの理由で、この例外:MediaPlayerの - java.io.FileNotFoundException:いいえ、コンテンツプロバイダ

W/MediaPlayerのオープン/保存ができませんでしたjava.io.FileNotFoundException:いいえ、コンテンツプロバイダ: /ストレージ/エミュレート/ 0 /音楽/一般的な音楽file.mp3

を続けるたびにポップアップ//0 /音楽/一般的な音楽 file.mp3エミュレート私はの曲を再生しようとします。

私は歌へのパスを取得する方法は、次のとおりです。

file.getAbsolutePath() 

ファイルは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(); 
} 

アイデア?

+0

あなたのアプリでNougat以上を実行していますか? –

答えて

0

おそらく、currentTrackは、Fileオブジェクトを持っています。その場合は、Uri.parse(currentTrack.getPath())currentTrack.getUri()に置き換えます。getUri()を実装すると、Fileの値はUri.fromFile()に戻ります。

これは、スキームがないため無効なUriを作成したため、すぐに問題が解決します。また、今後必要となるかもしれないファイル(例:contentUri値)ではないUriの種類に対処するように設定します。

+0

ありがとうございました、それは問題を解決しました! –

1

nougatまたはそれ以上のバージョンを使用している場合は、ヌークット以上のバージョンで発生します。Content Providerを使用する必要があります。

XMLリソースフォルダ内(例えばfile_provider_paths.xml用)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); 
関連する問題