简体   繁体   中英

album_info does not contain album_id column error

I'm creating a music player that populates an array list with song objects. Each song object has a series of attributes. One of those attributes is the album-art URI.

This is the line of code where I assign the URI attribute to the song object.

songObject.albumArtURI = GetAlbumArtURI(albumID); 

Here is the string value of albumID

Log.v("TAG",String.valueOf(albumID)); // prints [Ljava.lang.String;@44ce53d 

When I pass albumID to GetAlbumArtURI() method

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);

}

I get this error:

no such column: album_id (code 1)
while compiling: 
SELECT album_art FROM album_info WHERE (album_id=?)

The error essentially says that table album_info does not contain album_id column. But according to the documenation, album_info does have such a column.

So there's a few issues causing your query to return nothing and throw that error.

  1. MediaStore.Audio.Albums.ALBUM_ID is not the column you want to reference. You should be using MediaStore.Audio.Albums._ID .

  2. You need to move your cursor's read position to the first position when you get results, if possible. Doing otherwise will result in you never getting the results you need

  3. The way that MediaStore works on android is that you have to register the media files that you want the OS to know about - this isn't automatic. You need to implement something similar to the SingleMediaScanner described in this thread

Here is the working bit of code that I have written:

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());
    } 

When you have called that code, you're assuming that the MediaStore on your device knows about the music files you've downloaded or added. You can definitely implement a BroadcastReceiver to capture system events like files being added, but for this answer I'm just going to show how you account for one known file. You could also expand this to search an entire directory by adding to the onMediaScannerConnected(...) method.

If you implement the SingleMediaScanner file found here you can then just do:

    File file = new File(Environment.getExternalStorageDirectory() + "/Download/1.mp3");
    SingleMediaScanner singleMediaScanner = new SingleMediaScanner(this, file);

And it will register the media file in your MediaStore. At that point, you should be able to get results back from your query above. If you are having doubts of whether or not the songs are being registered, you can check to see if any records have been added at all by changing your mCursor call to this (to get all the results in the media store) and then iterating through them:

 final Cursor mCursor = getContentResolver().query(
                MediaStore.Audio.Albums.EXTERNAL_CONTENT_URI,
                null,
                null,
                null,
                null
        );

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

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