Android - запрос SMS ContentProvider?
В настоящее время я регистрирую наблюдателя контента в следующем 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
Это уже обсуждалось.
Чтобы прочитать SMS-сообщение от поставщика контента, проверьте:
- android-1-5-reading-sms-messages
Проверьте эти потоки:
О вашем комментарии, говорящем, что вы удаляете целую нить вместо одного sms:
Вы пробовали этот код?
Ответ 2
В столбце адреса указан телефонный номер отправителя смс.
Используйте 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);
}
Затем получите адрес отправителя sms:
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 имеет множество полезных методов.