我正在创建一个用歌曲对象填充数组列表的音乐播放器。每个歌曲对象都有一系列属性。其中一个属性是专辑艺术URI。
这是我将URI属性分配给歌曲对象的代码行。
songObject.albumArtURI = GetAlbumArtURI(albumID);
以下是albumID
Log.v("TAG",String.valueOf(albumID)); // prints [Ljava.lang.String;@44ce53d
当我将albumID
传递给GetAlbumArtURI()
方法
private String GetAlbumArtURI(String[] albumID){
final Cursor mCursor = getContentResolver().query(
MediaStore.Audio.Albums.EXTERNAL_CONTENT_URI,
new String[] {MediaStore.Audio.Albums.ALBUM_ART},
MediaStore.Audio.Albums.ALBUM_ID + "=?",
albumID, // Error
null
);
return mCursor.getString(0);
}
我收到此错误:
no such column: album_id (code 1)
while compiling:
SELECT album_art FROM album_info WHERE (album_id=?)
该错误实质上表示表album_info不包含album_id
列。但根据该文件,album_info确实有这样一个专栏。
答案 0 :(得分:3)
因此,有一些问题导致您的查询没有返回任何内容并抛出该错误。
MediaStore.Audio.Albums.ALBUM_ID
不是您要引用的列。您应该使用MediaStore.Audio.Albums._ID
。
如果可能,您需要在获得结果时将光标的读取位置移动到第一个位置。否则将导致您永远无法获得所需的结果
MediaStore
在android上运行的方式是你必须注册你希望操作系统知道的媒体文件 - 这不是自动的。您需要实现类似于SingleMediaScanner described in this thread
以下是我编写的代码的工作位:
try {
final Cursor mCursor = getContentResolver().query(
MediaStore.Audio.Albums.EXTERNAL_CONTENT_URI,
new String[] {MediaStore.Audio.Albums.ALBUM_ART},
MediaStore.Audio.Albums._ID + "=?",
null,
null
);
// You need to check if there are results in your cursor.
// This is like saying if(mCursor.getCount() > 0)
if(mCursor.moveToFirst()) {
return mCursor.getString(mCursor.getColumnIndex(MediaStore.Audio.Albums.ALBUM_ART));
} else {
return "";
}
} catch (Exception e) {
Log.e(this.getClass().getSimpleName(),e.getMessage());
}
当您拨打该代码时,您假设您设备上的MediaStore知道您已下载或添加的音乐文件。您绝对可以实现BroadcastReceiver
来捕获系统事件,例如正在添加的文件,但是对于这个答案,我将展示您如何考虑一个已知文件。您还可以通过添加onMediaScannerConnected(...)
方法来扩展它以搜索整个目录。
如果您实现了here找到的SingleMediaScanner文件,则可以执行以下操作:
File file = new File(Environment.getExternalStorageDirectory() + "/Download/1.mp3");
SingleMediaScanner singleMediaScanner = new SingleMediaScanner(this, file);
它将在您的MediaStore中注册媒体文件。此时,您应该能够从上面的查询中获得结果。如果您怀疑这些歌曲是否正在注册,您可以通过更改mCursor对此的调用(以获取媒体商店中的所有结果)来检查是否已添加任何记录,然后通过迭代它们:
final Cursor mCursor = getContentResolver().query(
MediaStore.Audio.Albums.EXTERNAL_CONTENT_URI,
null,
null,
null,
null
);