java.lang.IllegalArgumentException:不支持sortOrder

时间:2016-03-22 20:54:55

标签: java android

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

  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)

3 个答案:

答案 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);

如此处https://stackoverflow.com/a/708708/2444099所述。

答案 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在创建为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

从Mediastore

排序Android列表中的顺序

对于视频,您可以使用

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升序。

Android SQLite Sort order does not work with upper and lowercase letters

如果您使用的是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来反转排序顺序。