2015-10-15 100 views
1

我正在創建一個音樂播放器,用歌曲對象填充數組列表。每首歌曲對象都有一系列屬性。其中一個屬性是專輯封面URI。album_info不包含album_id列錯誤

這是將URI屬性分配給歌曲對象的代碼行。

songObject.albumArtURI = GetAlbumArtURI(albumID); 

這裏是albumID

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

字符串值當我通過albumIDGetAlbumArtURI()方法

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

@jyanks我不創建表。我正在訪問元數據表。他們應該已經在那裏。 –

+0

對不起,無視我以前的評論。你可以嘗試'MediaStore.Audio.Albums._ID +「=?」' – jyanks

+0

這給了我這個錯誤'android.database.CursorIndexOutOfBoundsException:索引-1請求,大小爲1',我認爲是描述[這裏]( http://stackoverflow.com/questions/21996228/mediastore-audio-albums-album-id-invalid-column)所以我認爲我的語法是正確的......我發佈了'albumID'的字符串值它看起來是否正確您? –

回答

3

所以有幾個問題導致您的查詢不返回並拋出該錯誤。

  1. MediaStore.Audio.Albums.ALBUM_ID不是您想要參考的列。你應該使用MediaStore.Audio.Albums._ID

  2. 如果可能,您需要將光標的讀取位置移動到第一個位置。否則會導致你永遠得不到你需要的結果

  3. 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(...)方法來擴展此搜索來搜索整個目錄。

如果要實現SingleMediaScanner文件中找到here然後你可以只是做:

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

如何測試單個媒體文件是否已在Media-store中註冊,因此每次音樂應用程序重新打開時,我都不必每個文件都調用SingleMediaScanner()。 –

+0

真的,您可以通過上面的contentResolver查詢來檢查該文件的媒體存儲。我意識到這並不理想,因此您可以將所有發現代碼放入後臺服務或類似的東西中,並在檢測到新文件時通知UI層。 – jyanks

+0

你認爲你可以幫助我這個[問題](http://stackoverflow.com/questions/33751762/unable-to-return-all-album-uris-with-content-resolver/33754002#33754002)這是與同一主題有關。謝謝。 –