【问题标题】:MediaPlayer - java.io.FileNotFoundException: No content providerMediaPlayer - java.io.FileNotFoundException:没有内容提供者
【发布时间】:2017-09-06 17:16:02
【问题描述】:

我编写 mp3 播放器已经有一段时间了,但由于某种原因出现了这个例外:

W/MediaPlayer:无法打开 /storage/emulated/0/Music/generic 音乐 file.mp3:java.io.FileNotFoundException:没有内容提供者: /storage/emulated/0/Music/generic 音乐文件.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();
}

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

有什么想法吗?

【问题讨论】:

  • 您的应用是否运行 Nougat 或更高版本?

标签: java android exception android-mediaplayer


【解决方案1】:

大概,currentTrack 有一个File 对象。如果是这样,请将Uri.parse(currentTrack.getPath()) 替换为currentTrack.getUri(),在此您实现getUri() 以返回Uri.fromFile() 的值,用于File

这解决了您的直接问题,即您创建了一个无效的Uri,因为它没有方案。它还使您能够处理将来可能需要的不是文件的 Uri 类型(例如,content Uri 值)。

【讨论】:

  • 如果一开始只有一个文件路径怎么办?当从您的评论中似乎可以使用 Uri.fromFile(new File(path)) 时,为什么必须实施 getUri ?我觉得这不是一个好的答案。我可以想到您的评论提出的其他 10 个问题。
【解决方案2】:

如果您使用牛轧糖或更高版本,则在牛轧糖或更高版本中会出现此问题,您必须使用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);

【讨论】:

  • 只有在将 Uri 传递给第三方应用程序 Activity 时才需要实现此功能
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-18
  • 2017-06-25
  • 2016-11-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多