【问题标题】:java.lang.IllegalArgumentException: sortOrder not supportedjava.lang.IllegalArgumentException:不支持 sortOrder
【发布时间】:2016-07-09 23:13:45
【问题描述】:

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

  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: 致命 例外: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)

【问题讨论】:

  • 这是完整的堆栈跟踪吗?
  • 我相信是的。为什么要问?

标签: java android


【解决方案1】:

您使用的是由 Google Play 音乐应用而非 Android 媒体系统专门处理的 Uri。 (com.google.android.music 是 Play Music 的包名。)我可以想象

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

b) 如错误提示,Play Music 内容提供程序不支持 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

【讨论】:

    【解决方案2】:

    似乎排序顺序 API 已更改。你能按 ARTIST_KEY 排序吗?我只是在看http://developer.android.com/reference/android/provider/MediaStore.Audio.AudioColumns.html 上的列,那个说它是可排序的。当您的排序顺序为空时,您的查询是否也有效?

    【讨论】:

    【解决方案3】:

    对于你的情况,你可以用它来排序,

    String sortOrder = MediaStore.Audio.Albums.DEFAULT_SORT_ORDER;
    

    对于URI,你可以使用-

    Uri uri = MediaStore.Audio.Artists.Albums.getContentUri("external", artistId);
    

    artistId 是上一个 Artist 查询中 MediaStore.Audio.Artists._ID 的值。

    这里, DEFAULT_SORT_ORDER:此表的默认排序顺序 常量值:“artist_key”

    希望对你有所帮助。


    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 数据库、游标或内容提供程序,您可能会遇到关于大小写字母的字母排序问题。

    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 来反转排序顺序。

    【讨论】:

      猜你喜欢
      • 2013-02-14
      • 2019-08-10
      • 2018-07-20
      • 1970-01-01
      • 1970-01-01
      • 2022-12-28
      • 2019-02-12
      • 2020-04-29
      • 1970-01-01
      相关资源
      最近更新 更多