Android - الاستعلام عن SMS ContentProvider؟
-
24-09-2019 - |
سؤال
أقوم حاليًا بتسجيل مراقب المحتوى على URI التالي "المحتوى: // sms/" للاستماع إلى الرسائل الواردة والصادرة التي يتم إرسالها.
يبدو أن هذا يعمل بشكل جيد وحاولت أيضًا حذف قاعدة بيانات الرسائل القصيرة ، لكن لا يمكنني سوى حذف مؤشر ترابط كامل من URI التالي "Content: // SMS/Enalvations/"
هنا هو الرمز الذي أستخدمه لذلك
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);
}
}
}
ومع ذلك ، أريد أن أكون قادرًا على الحصول على مصادفة ونص الرسالة من مزود محتوى الرسائل القصيرة ، هل يمكن لأي شخص أن يخبرني عن كيفية القيام بذلك؟
وأيضًا كيفية حذف رسالة واحدة بدلاً من موضوع كامل؟
المحلول
تمت مناقشة هذا بالفعل.
لقراءة الرسائل القصيرة من فحص مزود المحتوى: - Android-1-5-READ-SMS-Messages
تحقق من هذه المواضيع:
- حذف-SMS-in-And-Android-1-5
- إرشاد الحذف-sms-inbox-in-in-android-programmmary
- Can-we-delete-an-sms-in-Android-It-It-reaches-the-box
حول تعليقك قائلاً إنك تحذف خيط كامل بدلاً من الرسائل القصيرة واحدة: هل جربت الخروج هذا الرمز?
نصائح أخرى
يحتوي عمود العنوان على رقم هاتف مرسل الرسائل القصيرة.
استخدم Cursor.getString (Cursor.getColumnIndex ("العنوان")) لسحب رقم الهاتف كسلسلة. قم ببث مؤشر على المحتوى: // sms وفرزه في أمر تنازلي للتاريخ للحصول على أحدث رسالة. سيتعين عليك انتظار الرسالة الجديدة لإدخال الجدول وإلا فسوف تسحب المعلومات من الرسالة الخاطئة. في وضع الوضع ، استخدم BroadcastReceiver حلقة فترة ، في خيط ، يتغير الاقتراع من أجل cursor.getCount () للتغيير. ثم بعد LOOP 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");
هذا في حين أن الحلقة ستوقف الخيط حتى تصل الرسالة الجديدة. يمكنك أيضًا استخدام ContentObserver ، ولكن هذا في حين أن الحلقة بسيطة ولا تتطلب التسجيل وعدم التسجيل وفئة منفصلة.
بصراحة ، أعتقد أنه أسرع في سحب العنوان وجسم الرسالة مباشرة من PDU للقصد الوارد. وبهذه الطريقة ، لا يتعين عليك انتظار الرسالة لإدخال الجدول للحصول على العنوان والجسم. يحتوي SMSMessage من نوع Android على مجموعة متنوعة من الطرق المفيدة.