2011-12-14 16 views
8

Tôi biết cách truy xuất thể loại của một bài hát cụ thể, (xem getting the genres), nhưng tôi muốn truy xuất tất cả các bài hát thuộc một thể loại cụ thể. Vì "thể loại" dường như không phải là một trong các cột cho mục phương tiện, tôi không biết cách thực hiện trong một truy vấn, không giống như nghệ sĩ hoặc album. Có phương pháp hiệu quả nào không? Thanx!Android Mediastore: Làm cách nào để truy xuất hiệu quả tất cả các bài hát của một thể loại nhất định?

+0

Trừ khi danh sách nhạc là khổng lồ (30k bài hát +), tôi không nghĩ rằng bạn sẽ phải chịu đựng nhiều hình phạt về hiệu suất bằng cách chỉ nhận được tất cả các bài hát, sau đó kiểm tra thể loại đó và thêm đúng vào danh sách. – AedonEtLIRA

+0

Tôi có 2K bài hát và phải mất nhiều thời gian để muốn đưa ra một hộp thoại tiến bộ, ngay cả trên Samsung Charge nhanh vừa phải của tôi. Nó là rất chậm trên máy tính bảng giá rẻ 600MHz của tôi (vì một lý do nào đó, nhiều hơn gấp đôi). Đó là những gì tôi sẽ làm nếu cần thiết, nhưng tôi đã hy vọng có một mẹo tôi đang mất tích. – MBro

Trả lời

1

Bạn có thể thực hiện việc này bằng cách đặt cùng một URI nội dung và truy vấn MediaStore. Dưới đây là một số mã mượn từ máy nghe nhạc Android:

String [] cols = new String [] {MediaStore.Audio.Genres.NAME}; 
Cursor cursor = MusicUtils.query(this, 
       ContentUris.withAppendedId(MediaStore.Audio.Genres.EXTERNAL_CONTENT_URI, Long.valueOf(mGenre)), 
       cols, null, null, null); 

Đây là mã trong MusicUtils:

public static Cursor query(Context context, Uri uri, String[] projection, 
     String selection, String[] selectionArgs, String sortOrder, int limit) { 
    try { 
     ContentResolver resolver = context.getContentResolver(); 
     if (resolver == null) { 
      return null; 
     } 
     if (limit > 0) { 
      uri = uri.buildUpon().appendQueryParameter("limit", "" + limit).build(); 
     } 
     return resolver.query(uri, projection, selection, selectionArgs, sortOrder); 
    } catch (UnsupportedOperationException ex) { 
     ErrorReporter.getInstance().putCustomData("UnsupportedOperationException", "true"); 
     return null; 
    } 

} 
13
Uri uri = Audio.Genres.Members.getContentUri("external", genreID); 

String[] projection = new String[]{Audio.Media.TITLE, Audio.Media._ID}; 

Cursor cur = contentResolver.query(uri, projection, null, null, null); 
+0

Bạn có thể thêm một số văn bản giải thích những gì bạn đã làm ở đây có lẽ không? – Flexo

+0

Audio.Genres.Members.getContentUri ("external", genreID) làm cho uri, như (nội dung: // media/external/audio/genres/2/members) nơi "external" có nghĩa là chúng ta sẽ tìm kiếm thông qua nội dung bên ngoài, và "2" là ID thể loại. ContentResolver.query (...) truy vấn uri đã cho và trả về một Con trỏ trên tập kết quả. –

+0

@AlexanderMikhalevich bạn có thể giúp tôi cho http://stackoverflow.com/questions/25235127/cleanest-method-to-play-songs-from-album-artist-genre-in-android –

Các vấn đề liên quan