Android音乐查询代码报错:Invalid token date_addedDESC问题求助
MediaStore音频查询崩溃问题:定位与修复
崩溃日志
FATAL EXCEPTION: main Process: com.example.hh, PID: 2858 java.lang.RuntimeException: 无法启动Activity ComponentInfo{com.example.h3mplayer/com.example.hh.MainActivity}: java.lang.IllegalArgumentException: 无效令牌 date_addedDESC at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3449) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3601) at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:85) at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135) at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2066) at android.os.Handler.dispatchMessage(Handler.java:106) at android.os.Looper.loop(Looper.java:223) at android.app.ActivityThread.main(ActivityThread.java:7656) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:592) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:947) Caused by: java.lang.IllegalArgumentException: 无效令牌 date_addedDESC at android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:172) at android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:142) at android.content.ContentProviderProxy.query(ContentProviderNative.java:472) at android.content.ContentResolver.query(ContentResolver.java:1183) at android.content.ContentResolver.query(ContentResolver.java:1115) at com.example.h3mplayer.MainActivity.getAllAudio(MainActivity.kt:126) at com.example.h3mplayer.MainActivity.intializeLayout(MainActivity.kt:110) at com.example.h3mplayer.MainActivity.onCreate(MainActivity.kt:33) at android.app.Activity.performCreate(Activity.java:7994) at android.app.Activity.performCreate(Activity.java:7978) at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1309) at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3422) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3601) at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:85) at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135) at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2066) at android.os.Handler.dispatchMessage(Handler.java:106) at android.os.Looper.loop(Looper.java:223) at android.app.ActivityThread.main(ActivityThread.java:7656) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:592) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:947)
错误定位
崩溃根源在getAllAudio方法的第126行:
val cursor = this.contentResolver.query(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI,projection,selection,null, MediaStore.Audio.Media.DATE_ADDED + "DESC",null)
此处拼接排序参数时,MediaStore.Audio.Media.DATE_ADDED对应SQL列名date_added,直接拼接"DESC"会生成date_addedDESC,这是无效的SQL排序语法——列名和排序方向之间必须有空格分隔,导致ContentProvider抛出IllegalArgumentException。
修复方案
在"DESC"前添加空格,修正排序参数的拼接:
val selection = MediaStore.Audio.Media.IS_MUSIC + "!=0" val projection = arrayOf(MediaStore.Audio.Media._ID,MediaStore.Audio.Media.TITLE,MediaStore.Audio.Media.ALBUM, MediaStore.Audio.Media.ARTIST, MediaStore.Audio.Media.DURATION,MediaStore.Audio.Media.DATE_ADDED,MediaStore.Audio.Media.DATA) // 修正排序参数,添加空格分隔列名和排序方向 val cursor = this.contentResolver.query(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI,projection,selection,null, MediaStore.Audio.Media.DATE_ADDED + " DESC",null)
补充说明
- 调用链路:
onCreate(第33行)→intializeLayout(第110行)→getAllAudio(第126行),崩溃发生在查询MediaStore的环节。 - 也可以用字符串模板写法提升可读性:
"${MediaStore.Audio.Media.DATE_ADDED} DESC",效果相同。
内容的提问来源于stack exchange,提问作者HEMANTH KUMAR RAO M
相关产品推荐
相关产品推荐

