Android 4.4 发布后不久,我的代码自 2.2 以来一直正常工作,突然出现了错误。
我的代码将查询音乐数据库中给定的音乐文件。该路径在查询中返回,然后该路径被传递到 MediaPlayer。
Code:
String uri = "content://media/internal/audio/media";
String[] columns = [audio_id as _id, title, album, artist, album_id, _data];
String where = "album = 'XX'";
Cursor c = this.getContentResolver().query(uri, columns, where, null, MediaColumns.TITLE);
String musicPath = c.getString(5);
// musicPath is "/storage/emulated/0/Music/The XX/Islands.mp3"
player.reset();
player.setDataSource(musicPath);
player.setAudioStreamType(AudioManager.STREAM_MUSIC);
player.prepareAsync();
我最终在 LogCat 中收到无用的 Error(1, -2147483648) 消息。
我也尝试过更换
player.setDataSource(musicPath);
with
FileInputStream fileInputStream = new FileInputStream(musicPath);
player.setDataSource(fileInputStream.getFD());
fileInputStream.close();
但这会在 new FileInputStream(...) 上产生 FileNotFoundException:
java.io.FileNotFoundException:/storage/emulated/0/Music/The XX/Islands.mp3:打开失败:EACCES(权限被拒绝)
这很有趣,因为查询返回的路径以“/storage/emulated/...”开头,但如果我查看 Eclipse 中的 DDMS 视图,实际路径是“/mnt/shell/emulated/...”。这是正常的吗?
尽管如此,如果我手动将路径前缀更改为我在文件资源管理器中看到的路径前缀,我仍然会在 new FileInputStream(...) 上收到 FileNotFoundException:
java.io.FileNotFoundException:/mnt/shell/emulated/0/Music/The XX/Islands.mp3:打开失败:EACCES(权限被拒绝)
同样的例外。这个许可被拒绝的业务是怎么回事?直到 KitKat 为止,它都运行良好。我也添加了权限:
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
我的应用程序在清单中有这一行:
<uses-sdk android:minSdkVersion="8" android:targetSdkVersion="18" />
有没有人看起来类似并找到了这个未知错误的解决方案?我尝试播放的 mp3 在 Play Music 和另一个音乐播放器应用程序中运行良好,因此让我相信问题不是缺少编解码器。
谢谢
肖恩
编辑:
我在内容查询后立即检查文件是否存在而返回的路径不存在。
File f = new File(musicPath);
boolean exists = f.exists(); // false
这怎么可能?我尝试查询内部媒体,但没有返回任何结果(如预期)