سؤال

أقوم حاليًا بتسجيل مراقب المحتوى على 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

تحقق من هذه المواضيع:

حول تعليقك قائلاً إنك تحذف خيط كامل بدلاً من الرسائل القصيرة واحدة: هل جربت الخروج هذا الرمز?

نصائح أخرى

يحتوي عمود العنوان على رقم هاتف مرسل الرسائل القصيرة.

استخدم 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 على مجموعة متنوعة من الطرق المفيدة.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top