簡體   English   中英

Android - 查詢SMS ContentProvider?

[英]Android - Querying the SMS ContentProvider?

我目前在以下URI“content:// 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內容提供商處獲取收件人和消息文本,有人可以告訴我該怎么做嗎?

還有如何刪除一條消息而不是整個線程?

這已經討論過了。

要從內容提供程序中讀取SMS,請檢查: - android-1-5-reading-sms-messages

檢查這個主題:

關於你的評論說你要刪除整個線程而不是單個短信:你試過這段代碼嗎?

地址欄包含短信發件人的電話號碼。

使用cursor.getString(cursor.getColumnIndex(“address”))將電話號碼拉為字符串。 在內容上彈出光標:// 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有各種有用的方法。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM