以下代码在第三行和第四行的标题中引发异常。我错过了什么吗?我想能够按艺术家的名字排序。
public List<String> getAllArtists(Context context) {
List<String> artists = new ArrayList<String>();
String[] projection2 = {MediaStore.Audio.Media.ARTIST};
String sortOrder = MediaStore.Audio.Artists.ARTIST;
Uri songUri = Uri.parse("content://com.google.android.music.MusicContent/audio");
CursorLoader cl2 = new CursorLoader(context,
songUri, projection2, null, null, sortOrder);
cursor = cl2.loadInBackground();
while (cursor.moveToNext()) {
if (cursor.getString(0).length()>0){
if (!artists.contains(cursor.getString(0)))
artists.add(cursor.getString(0));
}}
cursor.close();
return artists;}
这是完整的堆栈跟踪:
03-22 16:49:18.237 2594-2637 / php_request E / AndroidRuntime:致命 EXCEPTION:IntentService [SongService]进程:php_request,PID:2594 java.lang.IllegalArgumentException:不支持sortOrder 在android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:165) 在android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:135) 在android.content.ContentProviderProxy.query(ContentProviderNative.java:421) 在android.content.ContentResolver.query(ContentResolver.java:500) 在android.content.CursorLoader.loadInBackground(CursorLoader.java:64) 在SongParser.getAllArtists(SongParser.java:41) 在SongService.onHandleIntent(SongService.java:60) 在android.app.IntentService $ ServiceHandler.handleMessage(IntentService.java:66) 在android.os.Handler.dispatchMessage(Handler.java:102) 在android.os.Looper.loop(Looper.java:148) 在android.os.HandlerThread.run(HandlerThread.java:61)
答案 0 :(得分:3)
您使用的是由Google Play音乐应用专门处理的Uri,而不是Android媒体系统。 (com.google.android.music
是Play Music的包名。)我可以想象
a)Play Music API无法与Android MediaStore
API混合使用,
b)播放音乐内容提供商不支持SQL中的排序,如错误所示,
c)Play Music API会随着时间的推移而发生变化,所以不管怎样都不要使用它。 (不要引用我这个。)
也许您想使用此处指定的Uri
常量之一http://developer.android.com/reference/android/provider/MediaStore.Audio.Media.html。这些是:
MediaStore.Audio.Media.INTERNAL_CONTENT_URI
MediaStore.Audio.Media.EXTERNAL_CONTENT_URI
如果要使用指定的Uri
,我建议您从内容提供商请求中删除sortOrder
,然后通过调用
List
进行排序
Collections.sort(artists);
答案 1 :(得分:1)
似乎排序顺序API已经改变了。你能对ARTIST_KEY排序吗?我只是查看http://developer.android.com/reference/android/provider/MediaStore.Audio.AudioColumns.html上的列,而且那个人说它可以排序。当您具有null排序顺序时,您的查询也可以工作吗?
答案 2 :(得分:0)
对于您的情况,您可以使用它进行排序,
String sortOrder = MediaStore.Audio.Albums.DEFAULT_SORT_ORDER;
对于URI,您可以使用 -
Uri uri = MediaStore.Audio.Artists.Albums.getContentUri("external", artistId);
artistId是前一个艺术家查询中MediaStore.Audio.Artists._ID
的值。
下面, DEFAULT_SORT_ORDER:此表的默认排序顺序 常数值:&#34; artist_key&#34;
希望它会对你有所帮助。
CursorLoader在创建为CursorLoader(Context context, Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder)
因此,要查询艺术家列表,您可以使用MediaStore.Audio.Artists.EXTERNAL_CONTENT_URI
并使用艺术家名称作为选择参数。
对于相册列表,您现在可以使用ARTIST_KEY
来查询MediaStore.Audio.Artists.Albums.EXTERNAL_CONTENT_URI
,以获取给定艺术家的相册列表。
资源链接:Media store default sort order
对于视频,您可以使用
String orderBy = android.provider.MediaStore.Video.Media.DATE_TAKEN;
videocursor = managedQuery(MediaStore.Video.Media.EXTERNAL_CONTENT_URI,
proj, null, null, orderBy + " DESC");
资源链接:sort order in android list from mediastore
为了向内容提供商指定查询的排序顺序,它看起来像
new CursorLoader(context, RepresentativeEntityContentProvider.CONTENT_URI, null, null,
null, "COLUMN_NAME ASC");
使用此功能,我们可以使用COLUMN_NAME升序。
如果您使用的是SQLite数据库,使用Cursor或者可能是内容提供程序,则可能会遇到有关大写和小写字母的字母排序问题。
String[] projection = { Table.COLUMN_ID, Table.COLUMN_TITLE};
String sortOrder = Table.COLUMN_TITLE + " COLLATE NOCASE ASC";
CursorLoader cursorLoader = new CursorLoader(this,
YourProvider.CONTENT_URI,
projection,
null,
null,
sortOrder);
字母排序问题的解决方案是查询中指定排序的COLLATE NOCASE
。
请注意,ASC是可选的指定。您还可以使用DESC
来反转排序顺序。