在本地播放mp3时,Android MediaPlayer错误(1,-2147483648)

时间:2013-12-08 14:45:21

标签: android audio media-player mp3

在Android 4.4发布后不久,我的代码自2.2以来一直正常工作突然变成了错误。

我的代码将在音乐数据库中查询给定的音乐文件。路径在查询中返回,然后将此路径传递到MediaPlayer。

代码:

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中收到无用的错误(1,-2147483648)消息。

我也尝试过替换

player.setDataSource(musicPath);

FileInputStream fileInputStream = new FileInputStream(musicPath);
player.setDataSource(fileInputStream.getFD());
fileInputStream.close();

但是这会在新的FileInputStream(...)上产生FileNotFoundException:

java.io.FileNotFoundException:/ storage / emulated / 0 / Music / XX / Islands.mp3:open failed:EACCES(Permission denied)

这很有趣,因为查询返回的路径以“/ storage / emulated / ...”开头,但如果我查看Eclipse中的DDMS视图,实际路径是“/ mnt / shell / emulated / ... ”。这是正常的吗?

尽管如此,如果我手动将路径前缀更改为我在文件资源管理器中看到的内容,我仍然会在新的FileInputStream(...)上获得FileNotFoundException:

java.io.FileNotFoundException:/ mnt / shell / emulated / 0 / Music / XX / Islands.mp3:open failed:EACCES(Permission denied)

相同的例外。这个权限被拒绝的业务是什么?直到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

这怎么可能?我尝试过查询内部媒体,但没有返回任何结果(正如预期的那样)

1 个答案:

答案 0 :(得分:0)

我通过向应用程序添加写入权限的(不幸)解决方案解决了这个问题。

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

显然从4.4开始这是必要的。任何人都可以证实或否认这一点吗?

肖恩