我已经写了很长时间的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 。
有什么想法吗?
答案 0 :(得分:2)
据推测,currentTrack
有File
个对象。如果是,请将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);