MediaPlayer - java.io.FileNotFoundException:没有内容提供者

时间:2017-09-06 17:16:03

标签: java android exception android-mediaplayer

我已经写了很长时间的MP3播放器了,但出于某种原因这个例外:

  

W / MediaPlayer:无法打开/存储/模拟/ 0 /音乐/通用音乐   file.mp3:java.io.FileNotFoundException:没有内容提供者:   / storage / emulated / 0 /音乐/通用音乐file.mp3

每当我尝试播放任何歌曲时,

会不断弹出。

我检索歌曲路径的方式是:

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();
}

其中是对类实例的引用,它扩展了 Service

有什么想法吗?

2 个答案:

答案 0 :(得分:2)

据推测,currentTrackFile个对象。如果是,请将Uri.parse(currentTrack.getPath())替换为currentTrack.getUri(),您可以在getUri()处为Uri.fromFile()返回File的值。

这解决了您的直接问题,即您创建了无效的Uri,因为它没有方案。它还可以让您处理非Uri类型的文件(例如,content Uri值),这些类型可能会在将来出现。

答案 1 :(得分:1)

如果您使用的是牛轧糖或更高版本,则必须使用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);