2010-04-06 4 views
11

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

Это, кажется, работает хорошо, и я также пытался удалить из базы данных смс, но я могу только удалить всю нить из следующего 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); 
    } 

} 


} 

Однако я хочу, чтобы иметь возможность получить recipricant и текст сообщения из SMS Content Provider, может кто-нибудь сказать мне, как это сделать?

А также как удалить одно сообщение, а не весь поток?

+0

Я проделал некоторый прогресс в этом в 1.5, но я запустил его на 1.6, и мой контент-наблюдатель перестает работать, в 1.5 его настроен для «content: // sms /», но разве это будет что-то другое для 1.6? –

+0

Хорошая статья об Android-методах SMS-сообщений: http: //mobdev.olin.edu/mobdevwiki/FrontPage/Tutorials/SMS% 20Messaging –

+0

Привет, Дональ, я видел ваш вопрос во время поиска решения моей проблемы. На самом деле я хочу знать о коде, который вы разместили перед объявлением класса. Эти коды принадлежат внешнему классу или что? Кстати, если вы решите свою проблему, тогда вы можете немного мне повести. Я использую Android 2.2, и моя проблема очень похожа на вашу. –

ответ

10

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

Чтобы прочитать SMS из содержимого проверки поставщика: - android-1-5-reading-sms-messages

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

Abo ваш комментарий, говорящий, что вы удаляете целую нить вместо одного sms: Вы пробовали this code?

+0

Спасибо, но эти темы касаются удаления SMS, которое является частью моего вопроса, а не основной части, также они не имеют особого отношения к удалению одного сообщения, но вместо этого выполняют то, что я уже разместил в моем коде выше, что они удаляют целую цепочку сообщений, а не одно сообщение в потоке из Uri «content: // sms/outbox /». Как и в моем вопросе, мой приоритет - выяснить, как получить текст сообщения и получатель от поставщика контента SMS. –

+1

@ Дональд: я только что отредактировал свой ответ. – Macarse

+0

Спасибо Macarse, некоторые интересные прочтения и фрагменты кода там –

4

Адресная колонка содержит номер телефона отправителя смс.

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

Это в то время приостановит нить до тех пор, пока приходит новое сообщение. Вы также можете использовать contentObserver, но цикл while прост и не требует регистрации, отмены регистрации и отдельного класса.

Откровенно говоря, я думаю, что он быстрее вытаскивает адрес и тело сообщения непосредственно из pdu входящего намерения. Таким образом, вам не нужно ждать, пока сообщение не войдет в таблицу, чтобы получить адрес и тело. Класс Android SmsMessage имеет множество полезных методов.

Смежные вопросы