12

我目前在以下 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 内容提供者那里获得收件人和消息文本,谁能告诉我该怎么做?

还有如何删除一条消息而不是整个线程?

4

2 回答 2

10

这已经讨论过了。

要从内容提供程序读取 SMS,请检查: - android-1-5-reading-sms-messages

检查这个线程:

关于您的评论说您正在删除整个线程而不是单个短信:您是否尝试过此代码

于 2010-04-06T11:15:06.670 回答
4

地址栏包含短信发送者的电话号码。

使用 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 有多种有用的方法。

于 2010-08-08T18:19:19.357 回答