Android:如何在 Kotlin 中列出短信线程/对话?

问题描述

我正在尝试使用 Kotlin 列出 Android 中的所有短信和彩信线程/对话。返回的列表应包括对话中的电话号码、最新消息的片段以及发送的日期和时间。理想情况下,它们应按最近的活动排序。

我可以使用以下工作代码单独列出所有短信(而不是通过线程/对话):(基于 https://stackoverflow.com/a/9494532

        val cursor: Cursor? = contentResolver.query(Uri.parse("content://sms"),null,null)

        if (cursor!!.moveToFirst()) { // must check the result to prevent exception
            do {
                var msgData = ""
                for (idx in 0 until cursor.getColumnCount()) {
                msgData += " " + cursor.getColumnName(idx).toString() + ":" + cursor.getString(idx)
                }
                Log.d("MY_APP",msgData)
            } while (cursor.moveToNext())
        } else {
            // empty box,no SMS
        }
        cursor.close()

我还可以通过将 val cursor: Cursor? = contentResolver.query(Uri.parse("content://sms"),null) 替换为以下内容来列出所有 SMS 对话:

val cr: ContentResolver = contentResolver
val conCursor = cr.query(Telephony.Sms.Conversations.CONTENT_URI,null)

问题在于它只返回一个片段、thread_id 和 msg_count。它不会返回对话中的电话号码,并且也会忽略 mms。这是 Telephony.Sms.Conversations 的预期行为,根据 https://developer.android.com/reference/kotlin/android/provider/Telephony.Sms.Conversations

看起来的解决方案是使用 Telephony.Threads.CONTENT_URI。根据文档 (https://developer.android.com/reference/kotlin/android/provider/Telephony.Threads),它包含 mms,并返回所有必需的信息。

但是,当我更换 val cursor: Cursor? = contentResolver.query(Uri.parse("content://sms"),null)

val cr: ContentResolver = contentResolver
val conCursor = cr.query(Telephony.Threads.CONTENT_URI,null)

它抛出以下错误:

****-**-** 18:48:12.014 5267-5267/com.example.sms E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.example.sms,PID: 5267
    java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.sms/com.example.sms.MainActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'boolean java.lang.String.equals(java.lang.Object)' on a null object reference
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2861)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2943)
        at android.app.ActivityThread.-wrap11(Unknown Source:0)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1630)
        at android.os.Handler.dispatchMessage(Handler.java:106)
        at android.os.Looper.loop(Looper.java:164)
        at android.app.ActivityThread.main(ActivityThread.java:6626)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:438)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:811)
     Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'boolean java.lang.String.equals(java.lang.Object)' on a null object reference
        at android.os.Parcel.readException(Parcel.java:2019)
        at android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:183)
        at android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:135)
        at android.content.ContentProviderProxy.query(ContentProviderNative.java:418)
        at android.content.ContentResolver.query(ContentResolver.java:754)
        at android.content.ContentResolver.query(ContentResolver.java:704)
        at com.example.sms.MainActivity.onCreate(MainActivity.kt:83)
        at android.app.Activity.performCreate(Activity.java:7032)
        at android.app.Activity.performCreate(Activity.java:7023)
        at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1236)
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2814)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2943) 
        at android.app.ActivityThread.-wrap11(Unknown Source:0) 
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1630) 
        at android.os.Handler.dispatchMessage(Handler.java:106) 
        at android.os.Looper.loop(Looper.java:164) 
        at android.app.ActivityThread.main(ActivityThread.java:6626) 
        at java.lang.reflect.Method.invoke(Native Method) 
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:438) 
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:811)

MainActivity.kt:83val conCursor = cr.query(Telephony.Threads.CONTENT_URI,null)

如何在 Kotlin 中列出带有电话号码的 sms/mms 线程?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...