我使用CursorLoder类从android的媒体内容提供程序中获取Genre列表。 下面是我的光标查询,用于获取类型列表。
public Loader<Cursor> onCreateLoader(int id, Bundle args) {
// currently filtering.
Uri baseUri;
baseUri = MediaStore.Audio.Genres.EXTERNAL_CONTENT_URI;
String[] STAR = { "*" };
return new CursorLoader(getActivity(), baseUri, STAR, null, null, null );
}
现在,我从媒体内容提供商处获得了所有类型列表,但我得到的数据存在问题。我也得到了之前创建的流派名称,但现在我没有歌曲。
我只想要有歌曲的流派,而不是没有歌曲的流派名称。
任何人都可以帮助我吗?
更新
我可以使用以下代码获取所有类型及其歌曲...
private void getGenresList() {
//-------------------------------------
int index;
long genreId;
int count;
Uri uri;
Cursor genrecursor;
Cursor tempcursor;
String[] proj1 = {MediaStore.Audio.Genres.NAME, MediaStore.Audio.Genres._ID};
String[] proj2={MediaStore.Audio.Media.DISPLAY_NAME};
genrecursor=getActivity().getContentResolver().query(MediaStore.Audio.Genres.EXTERNAL_CONTENT_URI,proj1,null, null, null);
if(genrecursor.moveToFirst())
{
do{
index = genrecursor.getColumnIndexOrThrow(MediaStore.Audio.Genres.NAME);
System.out.println("GENRE NAME: "+genrecursor.getString(index));
System.out.println("======================================");
index = genrecursor.getColumnIndexOrThrow(MediaStore.Audio.Genres._ID);
genreId=Long.parseLong(genrecursor.getString(index));
uri = MediaStore.Audio.Genres.Members.getContentUri("external", genreId);
tempcursor = getActivity().getContentResolver().query(uri, proj2, null,null,null);
System.out.println("Total Songs: "+tempcursor.getCount());
if(tempcursor.moveToFirst())
{
do{
index=tempcursor.getColumnIndexOrThrow(MediaStore.Audio.Media.DISPLAY_NAME);
System.out.println(" Song Name: "+tempcursor.getString(index));
}while(tempcursor.moveToNext());
}
System.out.println("======================================");
}while(genrecursor.moveToNext());
}
//-------------------------------------
}
但是,我必须使用两个查询,一个用于获取所有类型,第二个用于具有歌曲的类型的过滤数据。即使我想在CursorLoader中使用它,所以我很想知道如何做到这一点。
希望你对这个问题有所了解。
答案 0 :(得分:5)
似乎没有其他方法可以实现这一点,所以我只是在下面做... 通过以下更新,我可以获得仅包含歌曲的流派列表。过滤掉没有歌曲的流派列表。
public Loader<Cursor> onCreateLoader(int id, Bundle args) {
Uri baseUri;
if (mCurFilter != null) {
baseUri = Uri.withAppendedPath(
MediaStore.Audio.Media.EXTERNAL_CONTENT_URI,
Uri.encode(mCurFilter));
} else {
baseUri = MediaStore.Audio.Genres.EXTERNAL_CONTENT_URI;
}
String[] STAR = { MediaStore.Audio.Genres._ID,
MediaStore.Audio.Genres.NAME };
String query = " _id in (select genre_id from audio_genres_map where audio_id in (select _id from audio_meta where is_music != 0))" ;
return new CursorLoader(getActivity(),
MediaStore.Audio.Genres.EXTERNAL_CONTENT_URI, STAR, query,
null, null);
}
在上面的代码中,我已经将音频表加入了流派表。通过这种方式,我能够获取,无论该类型是否有歌曲。所以现在我只有那种有歌曲的流派。
希望这也有助于其他人。
享受编码......:)