在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
这怎么可能?我尝试过查询内部媒体,但没有返回任何结果(正如预期的那样)
答案 0 :(得分:0)
我通过向应用程序添加写入权限的(不幸)解决方案解决了这个问题。
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
显然从4.4开始这是必要的。任何人都可以证实或否认这一点吗?
肖恩