दिलचस्प पोस्ट
कैसे strtok () सी में टोकन में स्ट्रिंग विभाजित है? क्या विंडो 8 इंटरनेट एक्सप्लोरर 10 में अभी भी क्विर्समोड है? Android, विकल्प मेनू कैसे बनाएं लेट / लम्बी जोड़ी पर सड़क का पता लगाएं लिनक्स में एक धागा नाम कैसे करें? java.lang.ClassFormatError: अनुपस्थित कोड विशेषता जो क्लास फ़ाइल javax / faces / webapp / FacesServlet में मूल या सार नहीं है जेएसएफ ने बीन नामकरण सम्मेलनों का प्रबंधन किया Angular.JS: समान नियंत्रक साझा करने वाले दृश्य, दृश्य बदलते समय मॉडल डेटा रीसेट करता है उद्देश्य सी के ivars बनाम गुणों का उपयोग करने के कारण कस्टम HTTP प्राधिकरण हैडर संकलन समय और रनटाइम कास्टिंग सी # विंडोज पर स्टैक साइज़ बढ़ाएं (जीसीसी) सख्त और चेतावनियों का उपयोग क्यों करें? जेडीबीसी पृष्ठांकन जेपीडीएफ का इस्तेमाल करते हुए एचटीएमएल टेबल्स डेटा को पीडीएफ में कैसे निर्यात करना है

एंड्रॉइड में जावक एसएमएस या भेजे गए बॉक्स को सुनें

मैं एक ऐसा अनुप्रयोग विकसित कर रहा हूं जो सभी इनकमिंग और आउटगोइंग एसएमएस एसडी कार्ड में एक टेक्स्ट फ़ाइल में संग्रहीत करेगा।

मैं प्रसारण रिसीवर का उपयोग करते हुए आने वाले संदेशों को सुनने में सक्षम हूं I मुझे आउटगोइंग एसएमएस सुनने के लिए बहुत मुश्किल लग रहा है I

मुझे कुछ हद तक पता है कि प्रेषित बॉक्स या आउटबॉक्स पर एक कंटेंट ऑब्ज़र्वर सेट करना है, लेकिन मुझे नहीं पता कि यह कैसे करना है।

यह कैसे किया जा सकता है?

Solutions Collecting From Web of "एंड्रॉइड में जावक एसएमएस या भेजे गए बॉक्स को सुनें"

असल में, आपको एक सामग्री पर्यवेक्षक को रजिस्टर करना होगा … ऐसा कुछ:

ContentResolver contentResolver = context.getContentResolver(); contentResolver.registerContentObserver(Uri.parse("content://sms/out"),true, yourObserver); 

yourObserver एक ऑब्जेक्ट है ( new YourObserver(new Handler()) ) जो इस तरह दिख सकता है:

 class YourObserver extends ContentObserver { public YourObserver(Handler handler) { super(handler); } @Override public void onChange(boolean selfChange) { super.onChange(selfChange); // save the message to the SD card here } } 

तो, आप एसएमएस की सामग्री कैसे प्राप्त करते हैं? आपको Cursor उपयोग करना चाहिए:

 // save the message to the SD card here Uri uriSMSURI = Uri.parse("content://sms/out"); Cursor cur = this.getContentResolver().query(uriSMSURI, null, null, null, null); // this will make it point to the first record, which is the last SMS sent cur.moveToNext(); String content = cur.getString(cur.getColumnIndex("body")); // use cur.getColumnNames() to get a list of all available columns... // each field that compounds a SMS is represented by a column (phone number, status, etc.) // then just save all data you want to the SDcard :) 

यह एक यह हल करने के लिए मेरा दृष्टिकोण है

  1. एक ऐसी सेवा बनाएं, जिसे अन्य गतिविधि से बुलाया गया
  2. इसके अंदर एक सामग्री पर्यवेक्षक बनाएं

      @Override public int onStartCommand(Intent intent, int flag, int startId) { MyObserver myObserver = new MyObserver(new Handler()); ContentResolver contentResolver = this.getApplicationContext().getContentResolver(); contentResolver.registerContentObserver(Uri.parse("content://sms/sent"), true, myObserver); return START_STICKY; } 
  3. पर्यवेक्षक वर्ग बनाएँ

     class MyObserver extends ContentObserver { public MyObserver(Handler handler) { super(handler); } @Override public void onChange(boolean selfChange) { super.onChange(selfChange); Uri uriSMSURI = Uri.parse("content://sms/sent"); Cursor cur = getContentResolver().query(uriSMSURI, null, null, null, null); cur.moveToNext(); String content = cur.getString(cur.getColumnIndex("body")); String smsNumber = cur.getString(cur.getColumnIndex("address")); if (smsNumber == null || smsNumber.length() <= 0) { smsNumber = "Unknown"; } cur.close(); if(smsChecker( "OutgoingSMS to " + smsNumber + ": " + content)) { //save data into database/sd card here } } } 
  4. मैंने एक विधि smsChecker () को यह जांचने के लिए जोड़ा है कि नया संदेश अंतिम संदेश के समान है या नहीं

     public boolean smsChecker(String sms) { boolean flagSMS = true; if (sms.equals(lastSMS)) { flagSMS = false; } else { lastSMS = sms; } //if flagSMS = true, those 2 messages are different return flagSMS; } 

अगर हम गलत नहीं हैं, तो हम "सामग्री: // एसएमएस / प्रेषित" का उपयोग करते हैं, अगर हम केवल सभी संदेशों को चेक करना चाहते हैं, "सामग्री: // एसएमएस / आउट" अगर हम केवल सभी संदेशों को आउटबॉक्स में चेक करना चाहते हैं, और "सामग्री : // एसएमएस "अगर हम सभी संदेशों को देखना चाहते हैं

यह मेरा संस्करण है, जो एंड्रॉइड 6.0+ में सत्यापित किया गया है

 class smsObserver extends ContentObserver { private String lastSmsId; public smsObserver(Handler handler) { super(handler); } @Override public void onChange(boolean selfChange) { super.onChange(selfChange); Uri uriSMSURI = Uri.parse("content://sms/sent"); Cursor cur = getContentResolver().query(uriSMSURI, null, null, null, null); cur.moveToNext(); String id = cur.getString(cur.getColumnIndex("_id")); if (smsChecker(id)) { String address = cur.getString(cur.getColumnIndex("address")); // Optional: Check for a specific sender if (address.equals(phoneNumber)) { String message = cur.getString(cur.getColumnIndex("body")); // Use message content for desired functionality } } } // Prevent duplicate results without overlooking legitimate duplicates public boolean smsChecker(String smsId) { boolean flagSMS = true; if (smsId.equals(lastSmsId)) { flagSMS = false; } else { lastSmsId = smsId; } return flagSMS; } } 

इस कोड को रखें जहां प्रेक्षक को सक्षम किया जाना चाहिए

 ContentResolver contentResolver = getContentResolver(); contentResolver.registerContentObserver(Uri.parse("content://sms"), true, new smsObserver(new Handler())); 

यह मानता है कि आप एक गतिविधि का उपयोग कर रहे हैं। याद रखें कि आपको एक सेवा संदर्भ या रिसीवर से getContentResolver() को कॉल करने के लिए एक संदर्भ संदर्भ की आवश्यकता होगी।

मैंने देखा कि क्या गलत हो गया इसकी रेखा पर:

  contentResolver.registerContentObserver(Uri.parse("content://sms/sent"), true, _myObserver); 

आपको '/ प्रेषित' को हटाना होगा और सिर्फ 'सामग्री: // एसएमएस' लिखना चाहिए, पहले से ही सामग्रीऑब्सर्वर में भेजे गए एसएमएस को देखने के लिए निर्दिष्ट किया गया है।