Android - 查询 SMS ContentProvider?
Posted
技术标签:
【中文标题】Android - 查询 SMS ContentProvider?【英文标题】:Android - Querying the SMS ContentProvider? 【发布时间】:2011-02-04 18:11:44 【问题描述】:我目前在以下 URI“content://sms/”上注册了一个内容观察器,以侦听正在发送的传入和传出消息。
这似乎工作正常,我也尝试从 sms 数据库中删除,但我只能从以下 URI“content://sms/conversations/”中删除整个线程
这是我使用的代码
String url = "content://sms/";
Uri uri = Uri.parse(url);
getContentResolver().registerContentObserver(uri, true, new MyContentObserver(handler));
class MyContentObserver extends ContentObserver
public MyContentObserver(Handler handler)
super(handler);
@Override public boolean deliverSelfNotifications()
return false;
@Override public void onChange(boolean arg0)
super.onChange(arg0);
Log.v("SMS", "Notification on SMS observer");
Message msg = new Message();
msg.obj = "xxxxxxxxxx";
handler.sendMessage(msg);
Uri uriSMSURI = Uri.parse("content://sms/");
Cursor cur = getContentResolver().query(uriSMSURI, null, null,
null, null);
cur.moveToNext();
String protocol = cur.getString(cur.getColumnIndex("protocol"));
if(protocol == null)
Log.d("SMS", "SMS SEND");
int threadId = cur.getInt(cur.getColumnIndex("thread_id"));
Log.d("SMS", "SMS SEND ID = " + threadId);
Cursor c = getContentResolver().query(Uri.parse("content://sms/outbox/" + threadId), null, null,
null, null);
c.moveToNext();
int p = cur.getInt(cur.getColumnIndex("person"));
Log.d("SMS", "SMS SEND person= " + p);
//getContentResolver().delete(Uri.parse("content://sms/conversations/" + threadId), null, null);
else
Log.d("SMS", "SMS RECIEVE");
int threadIdIn = cur.getInt(cur.getColumnIndex("thread_id"));
getContentResolver().delete(Uri.parse("content://sms/conversations/" + threadIdIn), null, null);
但是我希望能够从 SMS 内容提供者那里获得收件人和消息文本,谁能告诉我该怎么做?
还有如何删除一条消息而不是整个线程?
【问题讨论】:
我在 1.5 中在这方面取得了一些进展,但我在 1.6 上运行它并且我的内容观察器停止工作,在 1.5 中它设置为“content://sms/”但它应该是什么与 1.6 不同? 一篇关于android SMS Messaging方法的好文章:mobdev.olin.edu/mobdevwiki/FrontPage/Tutorials/SMS%20Messaging 您好,Donal,我在为我的问题寻找解决方案时看到了您的问题。其实我想知道你在类声明之前发布的代码。这些代码属于外部类还是什么?顺便说一句,如果你解决了你的问题,那么你能指导我一下。我使用的是 Android 2.2,我的问题和你的很相似。 【参考方案1】:这已经讨论过了。
要从内容提供程序读取 SMS,请检查: - android-1-5-reading-sms-messages
检查此线程:
delete-sms-in-android-1-5 how-to-delete-sms-from-inbox-in-android-programmatically can-we-delete-an-sms-in-android-before-it-reaches-the-inbox关于您说您正在删除整个线程而不是单个短信的评论: 你试过this code吗?
【讨论】:
谢谢,但这些线程只处理删除短信,这只是我问题的一部分,而不是主要部分,他们也没有专门处理删除一条消息,而是做我已经做过的事情在我上面的代码中发布,即他们删除了整个对话线程,而不是来自 Uri“content://sms/outbox/”的线程中的单个消息。在我的问题中,我的首要任务是找出如何从 SMS 内容提供商那里检索消息文本和接收器 感谢 Macarse,那里有一些有趣的阅读和代码 sn-ps 我在 1.5 中在这方面取得了一些进展,但我在 1.6 上运行它并且我的内容观察器停止工作,在 1.5 中它设置为“content://sms/”但它应该是什么与 1.6 不同? 不确定,但我想你可以看看这个:developer.android.com/intl/fr/resources/articles/…【参考方案2】:地址栏包含短信发送者的电话号码。
使用 cursor.getString(cursor.getColumnIndex("address")) 将电话号码作为字符串提取。在 content://sms 上弹出光标并按日期降序对其进行排序以获取最新消息。您必须等待新消息进入表格,否则您将从错误消息中提取信息。在incomingSMS broadcastReceiver 中使用while 循环,在线程中轮询cursor.getCount() 以进行更改。然后在 while 循环之后 cursor.moveToFirst 将是新消息。
例如:
Cursor cur = getContentResolver().query(Uri.parseUri(content://sms), null, null, null, null);
int count = cur.getCount();
while (cur.getCount() == count)
Thread.sleep(1000);
cur = getContentResolver().query(Uri.parseUri(content://sms), null, null, null, null);
然后获取短信发送者的地址:
cur = getContentResolver().query(Uri.parseUri(content://sms), null, null, null, "date DESC");
cur.MoveToFirst();
String telephoneNumber = cur.getString(cur.getColumnIndex("address");
这个 while 循环将暂停线程,直到新消息到达。也可以使用 contentObserver,但是这个 while 循环很简单,不需要注册、注销和单独的类。
坦率地说,我认为直接从传入意图的 pdu 中提取地址和消息正文会更快。这样您就不必等待消息进入表格来获取地址和正文。 Android 类 SmsMessage 有多种有用的方法。
【讨论】:
以上是关于Android - 查询 SMS ContentProvider?的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Android Studio 中创建项目以运行默认 SMS 应用程序
Android 短信内容 (content://sms/sent)
xml 示例如何使用Unity3D和SMS Manager在Android中发送SMS。 (无需打开SMS Composer)