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 4.2后台短信[关闭]

Android 上的 0 类 SMS(闪存 SMS)

Android 短信内容 (content://sms/sent)

xml 示例如何使用Unity3D和SMS Manager在Android中发送SMS。 (无需打开SMS Composer)

在 Android 中发送和接收 SMS 和 MMS(Kit Kat Android 4.4 之前)