问题描述
我正在尝试使用 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:83
是 val conCursor = cr.query(Telephony.Threads.CONTENT_URI,null)
如何在 Kotlin 中列出带有电话号码的 sms/mms 线程?
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)