Android - запрашивает SMS ContentProvider? - PullRequest
12 голосов
/ 06 апреля 2010

В настоящее время я регистрирую обозреватель контента для следующего URI "content: // sms /", чтобы прослушивать отправляемые и входящие сообщения.

Это работает нормально, и я также попытался удалить избаза данных смс, но я могу только удалить всю цепочку из следующего URI "содержимого: // смс / разговор /"

Вот код, который я использую для этого

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, кто-нибудь может сказать мне, как это сделать?

А также как удалить одно сообщение вместо всей цепочки?

Ответы [ 2 ]

10 голосов
/ 06 апреля 2010

Это уже обсуждалось.

Чтобы прочитать SMS от провайдера контента, проверьте: - android-1-5-reading-sms-messages

Проверьте эту тему:

О вашем комментарии о том, что вы удаляете целую ветку вместо одной смс: Вы пробовали этот код ?

4 голосов
/ 08 августа 2010

Столбец адреса содержит номер телефона отправителя смс.

Используйте cursor.getString (cursor.getColumnIndex ("адрес")), чтобы получить номер телефона в виде строки. Поместите курсор на content: // sms и отсортируйте его в порядке убывания даты, чтобы получить самое последнее сообщение. Вам придется ждать, пока новое сообщение не войдет в таблицу, иначе вы извлечете информацию из неправильного сообщения. Во входящем SMSScastReceiver используйте цикл while, в потоке, опрашивая курсор. 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 имеет множество полезных методов.

...