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不能与AndroidMediaStore
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不能与AndroidMediaStore
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
的值
这里,,
默认排序顺序:此表的默认排序顺序
常量值:“艺术家_键”
希望会