此问题已多次报告,但仍未解决。我在Samsung's developers site或in StackOverflow
中阅读了与此主题有关的所有消息/帖子让我再说几句话来描述整个问题:
开发人员过去通过以下简单查询获取短信对话列表:
Uri.parse("content://mms-sms/conversations/");
Cursor cursor = context.getApplicationContext().getContentResolver().query(uri, null, null, null, null);
或类似的东西。这里的关键点是URI地址:content://mms-sms/conversations
每个人都知道这是非官方的,并且自己承担风险 - see proof link here
但是,这里的关键点很简单,这个代码只能在三星Galaxy S3和Galaxy Tab 2的某些型号中正常工作。它使用stacktrace生成NullPointerException
:
java.lang.NullPointerException
at android.os.Parcel.readException(Parcel.java:1431)
at android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:188)
at android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:140)
at android.content.ContentProviderProxy.query(ContentProviderNative.java:366)
at android.content.ContentResolver.query(ContentResolver.java:372)
at android.content.ContentResolver.query(ContentResolver.java:315)
在世界/宇宙其他地方的所有其他设备中,它运作良好!奇怪,是吗?
我知道这样的答案:嘿伙计,这是你的问题,因为上述URI的存在/正确性无法保证,但是,有人有更有成效的想法吗?
我已经通过他们的论坛向三星的开发者发布了问题。
答案 0 :(得分:10)
最后我想到了如何克服上述问题(我不确定它是否是错误,但无论如何它看起来像一个错误)。
可以通过此查询检索对话列表:
Uri.parse("content://mms-sms/conversations?simple=true");
Cursor cursor = context.getApplicationContext().getContentResolver().query(uri, null, null, null, null);
此处的关键点是URI content://mms-sms/conversations?simple=true
。
答案 1 :(得分:1)
我也遇到了这个问题,似乎没有解决它的问题。 检查@barmaley答案,它也为我产生了同样的例外
@edit 我的朋友刚刚在他的sgs3上检查了这个,它确实有效!但他不能得到身体/地址专栏,但它是一个开始!非常奇怪的是,它不适用于我的工作。我的sgs3来自波兰分销,他来自美国......如果地区之间存在差异,这可能会比预期更糟糕
答案 2 :(得分:1)
如果仅对SMS对话感兴趣,并且希望您没有content://mms-sms/conversations?simple=true
无法获得的其他SMS列,则可以尝试在ContentResolver查询中对SMS进行自己的分组。
content://sms
"DISTINCT " + Inbox.THREAD_ID, Inbox.ADDRESS, Inbox.BODY, Inbox.DATE
等... Inbox.THREAD_ID + " IS NOT NULL) GROUP BY (" + Inbox.THREAD_ID
Inbox.DEFAULT_SORT_ORDER
请注意,由于ContentResolver在其生成的数据库查询中添加了方括号,因此我必须在GROUP BY之前插入一个虚拟条件“ IS NOT NULL”。