java.lang.IllegalArgumentException:不支持排序器

java.lang.IllegalArgumentException:不支持排序器,java,android,Java,Android,下面的代码在第三行和第四行的标题中抛出异常。我错过什么了吗?我想能够排序艺术家的名字 public List<String> getAllArtists(Context context) { List<String> artists = new ArrayList<String>(); String[] projection2 = {MediaStore.Audio.Media.ARTIST}; String s

下面的代码在第三行和第四行的标题中抛出异常。我错过什么了吗?我想能够排序艺术家的名字

  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;}
公共列表getAllArtists(上下文){
列表艺术家=新建ArrayList();
字符串[]projection2={MediaStore.Audio.Media.ARTIST};
字符串sortOrder=MediaStore.Audio.Artists.ARTIST;
Uri songUri=Uri.parse(“content://com.google.android.music.MusicContent/audio");
游标装入器cl2=新游标装入器(上下文,
songUri,projection2,null,null,sortOrder);
cursor=cl2.loadInBackground();
while(cursor.moveToNext()){
if(cursor.getString(0.length()>0){
如果(!artists.contains(cursor.getString(0)))
add(cursor.getString(0));
}}
cursor.close();
返回艺术家;}
以下是完整的堆栈跟踪:

03-22 16:49:18.2372594-2637/php_请求E/AndroidRuntime:FATAL 例外:IntentService[SongService]进程:php_请求,PID:2594 java.lang.IllegalArgumentException:不支持排序器 位于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.onHandleContent(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) 运行(HandlerThread.java:61)


似乎排序顺序API已经更改。你能按字母键排序吗?我只是在看上面的专栏,那一篇说它是可排序的。当排序顺序为空时,您的查询也可以工作吗?

似乎排序顺序API已经更改。你能按字母键排序吗?我只是在看上面的专栏,那一篇说它是可排序的。当您的排序顺序为空时,您的查询也可以工作吗?

您使用的是专门由Google Play Music应用程序处理的Uri,而不是Android媒体系统。(
com.google.android.music
是Play music的软件包名。)我可以想象得到

a) Play Music API不能与Android
MediaStore
API混合使用

b) Play Music content provider不支持SQL中的排序,如错误所示

c) 播放音乐API会随着时间的推移而变化,所以无论如何不要使用它。(不要引用我的话。)

也许您想使用此处指定的
Uri
常量之一。这些是:

MediaStore.Audio.Media.INTERNAL_CONTENT_URI
MediaStore.Audio.Media.EXTERNAL_CONTENT_URI
如果打算使用指定的
Uri
,我建议从内容提供商请求中删除
sortOrder
,然后通过调用

Collections.sort(artists);

如本文所述。

您使用的是一个专门由Google Play Music应用程序处理的Uri,而不是Android媒体系统。(
com.google.android.music
是Play music的软件包名。)我可以想象得到

a) Play Music API不能与Android
MediaStore
API混合使用

b) Play Music content provider不支持SQL中的排序,如错误所示

c) 播放音乐API会随着时间的推移而变化,所以无论如何不要使用它。(不要引用我的话。)

也许您想使用此处指定的
Uri
常量之一。这些是:

MediaStore.Audio.Media.INTERNAL_CONTENT_URI
MediaStore.Audio.Media.EXTERNAL_CONTENT_URI
如果打算使用指定的
Uri
,我建议从内容提供商请求中删除
sortOrder
,然后通过调用

Collections.sort(artists);

如这里所述。

对于您的案例,您可以使用它进行排序

String sortOrder = MediaStore.Audio.Albums.DEFAULT_SORT_ORDER;
对于URI,您可以使用-

Uri uri = MediaStore.Audio.Artists.Albums.getContentUri("external", artistId);
artistId是来自上一个艺术家查询的
MediaStore.Audio.Artists.\u ID
的值

这里,, 默认排序顺序:此表的默认排序顺序 常量值:“艺术家_键”

希望它能帮助你


游标装入器是做什么的? 当创建为
CursorLoader(上下文上下文、Uri、字符串[]投影、字符串选择、字符串[]selectionArgs、字符串排序器)时,CursorLoader会为您进行排序。

因此,要查询艺术家列表,可以使用
MediaStore.Audio.Artists.EXTERNAL\u CONTENT\u URI
并使用艺术家名称作为选择参数。 对于相册列表,您现在有了
ARTIST\u键
,可以使用该键查询
MediaStore.Audio.Artists.albums.EXTERNAL\u CONTENT\u URI
,以获取给定艺术家的相册列表

资源链接:


Mediastore中Android列表的排序顺序 对于视频,您可以使用它

String orderBy = android.provider.MediaStore.Video.Media.DATE_TAKEN;
     videocursor = managedQuery(MediaStore.Video.Media.EXTERNAL_CONTENT_URI,
            proj, null, null, orderBy + " DESC");
资源链接:


使用列名进行查询排序。 为内容提供者指定查询的排序顺序,如下所示

new CursorLoader(context, RepresentativeEntityContentProvider.CONTENT_URI, null, null,
            null, "COLUMN_NAME ASC");
使用它,我们可以使其按列名称升序排列


如果您使用的是带有光标或内容提供者的SQLite数据库,则可能会遇到有关大小写字母的字母排序问题

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);
字母排序问题的解决方案是查询中指定排序的部分中的
collatenocase


请注意,ASC是可选的。您还可以使用
DESC
反转排序顺序。

对于您的案例,您可以使用它进行排序

String sortOrder = MediaStore.Audio.Albums.DEFAULT_SORT_ORDER;
对于URI,您可以使用-

Uri uri = MediaStore.Audio.Artists.Albums.getContentUri("external", artistId);
artistId是来自上一个艺术家查询的
MediaStore.Audio.Artists.\u ID
的值

这里,, 默认排序顺序:此表的默认排序顺序 常量值:“艺术家_键”

希望会