繁体   English   中英

album_info不包含album_id列错误

[英]album_info does not contain album_id column error

我正在创建一个音乐播放器,用歌曲对象填充数组列表。 每个歌曲对象都有一系列属性。 其中一个属性是专辑艺术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=?)

该错误实质上表示table album_info不包含album_id列。 但根据该文件, album_info确实有这样一个专栏。

因此,有一些问题导致您的查询没有返回任何内容并抛出该错误。

  1. MediaStore.Audio.Albums.ALBUM_ID不是您要引用的列。 您应该使用MediaStore.Audio.Albums._ID

  2. 如果可能,您需要在获得结果时将光标的读取位置移动到第一个位置。 否则将导致您永远无法获得所需的结果

  3. MediaStore在android上运行的方式是你必须注册你希望操作系统知道的媒体文件 - 这不是自动的。 您需要实现类似于此线程中描述SingleMediaScanner的内容

这是我编写的代码的工作位:

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(...)方法来扩展它以搜索整个目录。

如果您实现此处的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
        );

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM