2011-08-10 13 views
6

पता करें मैं एक फोन से आउटगोइंग एसएमएस संदेशों की संख्या गिनने के लिए आवेदन करने की कोशिश कर रहा हूं। वर्तमान में मैं निम्नलिखित कोड है:एंड्रॉइड: एसएमएस आउटगोइंग, गलत गणना

private void listenForSMS(){ 
    Log.v("SMSTEST", "STARTED LISTENING FOR SMS OUTGOING"); 
    Handler handle = new Handler(){}; 

    SMSObserver myObserver = new SMSObserver(handle); 

    ContentResolver contentResolver = getContentResolver(); 
    contentResolver.registerContentObserver(Uri.parse("content://sms"),true, myObserver); 
} 

private class SMSObserver extends ContentObserver{ 

    int count = 0; 
    String lastMessage = null; 

    public SMSObserver(Handler handler) { 
     super(handler); 
    } 

    public void onChange(boolean selfChange) { 
     super.onChange(selfChange); 

     Log.v("SMSTEST", "HIT ON CHANGE"); 

     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){ 
      count++; 
      Log.v("SMSTEST", "SMS SENT: count: " + count); 
      String content = cur.getString(cur.getColumnIndex("body")); 

     }else{ 
      Log.v("SMSTEST", "SMS RECIEVED"); 
     } 
    } 
} 

जब मैं एक एक पृष्ठ एसएमएस संदेश भेजने, onChange 3 बार कहा जाता है। जब मैं दो पेज एसएमएस संदेश भेजता हूं, onChange को 4 बार कहा जाता है। 3 पृष्ठ संदेश, जिसे 5 बार कहा जाता है; और इसी तरह।

नोट:, और अलावा कुछ भी नहीं "सामग्री: // एसएमएस" onChange हो गया है के नाम से जाना: मैं इस तरह के "// एसएमएस/भेजा सामग्री" के रूप में Uri.parse("content://sms") के अन्य रूपों की कोशिश की है।

मैं एक आउटगोइंग एसएमएस संदेश को विशिष्ट रूप से अलग कैसे कर सकता हूं और भेजे गए एसएमएस संदेशों की सटीक गणना कैसे प्राप्त कर सकता हूं?

+0

मुझे एक समाधान मिला जो वास्तव में काफी सरल है। बस थोड़ी देर लूप करें और क्वेरी करें जहां दिनांक> = कुछ समय। –

उत्तर

2

मुझे मेरी समस्या का समाधान मिला। एसएमएस और एमएमएस को उनके _id मान द्वारा विशिष्ट रूप से विशिष्ट किया जा सकता है।

Uri uriSMSURI = Uri.parse("content://sms"); 
    Cursor cur = getContentResolver().query(uriSMSURI, null, null, 
       null, null); 
    cur.moveToNext(); 
String id = cur.getString(cur.getColumnIndex("_id")); 
0

मैं एक आउटगोइंग एसएमएस संदेश को विशिष्ट रूप से अलग कैसे कर सकता हूं और भेजे गए एसएमएस संदेशों की सटीक गणना कैसे प्राप्त कर सकता हूं?

आप नहीं कर सकते।

यह सामग्री प्रदाता एंड्रॉइड एसडीके का हिस्सा नहीं है। इसका उपयोग अनियंत्रित और असमर्थित है। इसके अलावा, किसी दिए गए संदेश क्लाइंट (उदा।, एओएसपी मैसेंजर ऐप) का उपयोग कैसे किया जा सकता है यह स्वयं अनियंत्रित और असमर्थित है। एक भेजे गए एसएमएस के परिणामस्वरूप सामग्री प्रदाता में 1,337 परिवर्तन हो सकते हैं, और आपके पास जानने का कोई तरीका नहीं है। इसके अलावा, इस या किसी भी सामग्री प्रदाता में भी आउटगोइंग एसएमएस संदेशों को रिकॉर्ड करने की आवश्यकता नहीं है। और, यदि recent behavior कोई संकेत है, तो यह संभव है कि Google भविष्य में इस सामग्री प्रदाता को तृतीय-पक्ष पहुंच को बंद कर देगा।

4

ध्यान दें कि, जब आप एक एसएमएस संदेश भेजते हैं, तो यह संदेश की स्थिति को बचाएगा। इसे हल करने के लिए, आप रिकॉर्ड int type = c.getInt(c.getColumnIndex("type")); 3 बार है कि के प्रकार की जाँच onchange():
1: प्रकार = 6
2: प्रकार = 4
3: type = 2 (सफलता)
तो आप बढ़ा सकते हैं अपने काउंटर।
यह मामला केवल 1 प्राप्तकर्ता के लिए आवेदन किया गया है।
यदि 1 और अधिक प्राप्तकर्ता हैं, तो प्रकार प्राप्त करने के लिए "thread_id" और "देखा" की आवश्यकता है। आप जांच सकते हैं कि कितने संदेश सफलता भेजे गए हैं।
शुभकामनाएं!

+0

यह सबसे अच्छा समाधान है जो मैं डुप्लिकेट एसएमएस ट्रिगर्स के लिए पा सकता हूं। मेरे मामले में केवल आउटगोइंग एसएमएस तीन बार ट्रिगर हो गया। आने वाले एसएमएस के साथ कोई समस्या नहीं है। इनमें से प्रत्येक स्थिति का प्रतिनिधित्व क्या करता है? 6 और 4 क्या है? मुझे टाइप 4 नहीं दिखाई देता है। पहली बार मुझे टाइप 6 मिलता है, फिर दो बार मुझे टाइप 2 मिलता है। क्या टाइप कोड डिवाइस पर फॉर्म डिवाइस बदलता है? क्या यह भरोसेमंद है? – nous

+0

@ केविन: असफल परिदृश्य को संभालना संभव है? –

संबंधित मुद्दे