2011-08-19 20 views
6

मैं सेल प्रसारण संदेश सिर्फ एसएमएस की तरह के पाठ प्राप्त करने की कोशिश की, लेकिन यह काम does'not:सेल ब्रॉडकास्ट संदेश कैसे प्राप्त करें?

public class SMSReceiver extends BroadcastReceiver { 

@Override 
public void onReceive(Context context, Intent intent) { 
    Bundle bundle = intent.getExtras(); 
    SmsMessage[] msgs = null; 
    String str = ""; 
    if (bundle != null) { 
     // ---retrieve the SMS message received--- 
     Object[] pdus = (Object[]) bundle.get("pdus"); 
     msgs = new SmsMessage[pdus.length]; 
     for (int i = 0; i < msgs.length; i++) { 
      msgs[i] = SmsMessage.createFromPdu((byte[]) pdus[i]); 
      str =msgs[i].getOriginatingAddress(); 
      str += " :"; 
      str += msgs[i].getMessageBody().toString(); 

आप इसे पाने के लिए किसी भी तरह से पता है?

+1

क्या आपको एक पुश सूचना, या की तरह सेल प्रसारण संदेश मतलब है, ...? – Jakar

+0

@ जाकर - [सेल ब्रॉडकास्ट] (http://en.wikipedia.org/wiki/Cell_Broadcast) – GrAnd

उत्तर

7

मैं भी इस सवाल की जांच पर कुछ समय बिताया। और ऐसा लगता है कि ऐसा करने के लिए कोई सार्वजनिक एपीआई नहीं है। लेकिन मैं अपने रिवर्स इंजीनियरिंग अनुसंधान से कुछ परिणाम साझा कर सकते हैं ...

मेरे सैमसंग गैलक्सी एस सीबी संदेश प्राप्त करने में सक्षम है, तो मैं SMS एप्लिकेशन decompiled और कोड में देखा।

<receiver android:name=".transaction.PrivilegedSmsReceiver"> 
     ... 
     <intent-filter> 
      <action android:name="android.provider.Telephony.CB_RECEIVED" /> 
     </intent-filter> 
     <intent-filter> 
      <action android:name="android.provider.Telephony.CB_SETTINGS_AVAILABLE" /> 
     </intent-filter> 
     <intent-filter> 
      <action android:name="android.provider.Telephony.SET_CB_ERR_RECEIVED" /> 
     </intent-filter> 
     <intent-filter> 
      <action android:name="android.provider.Telephony.GET_CB_ERR_RECEIVED" /> 
     </intent-filter> 
    </receiver> 

नोट android.provider.Telephony.CB_RECEIVED आशय फिल्टर: यह अपने मैनिफ़ेस्ट फ़ाइल में निम्नलिखित BroadcastReceiver है। मुझे इसके बारे में कोई दस्तावेज नहीं मिला, लेकिन इसके नाम से मैंने माना कि यह एकमात्र प्रसारण है जिसे मुझे अभी पकड़ने की जरूरत है।

फिर मैंने डीकंपिल्ड एपीके के कोड के माध्यम से खोज की और पाया कि यह android.provider.Telephony.Sms.Intents->getCbMessagesFromIntent() इंटरफ़ेस का उपयोग सीबी संदेशों को पुनर्प्राप्त करने के लिए करता है, जो CbMessage क्लास इंस्टेंस देता है। इस इंटरफेस भी सरल एसएमएस संदेश के लिए पुरानी है, तो मैं मान लिया है कि CbMessage साथ pdusSmsMessage के रूप में करता है काम करना चाहिए। अंततः मुझे source of SmsCbMessage कक्षा मिली जो एपीआई द्वारा SmsMessage के समान ही है। यह 5-6 आंतरिक एंड्रॉइड जावा फाइलों पर निर्भर करता है, इसलिए सादगी के लिए मैं उन्हें एक ही साइट से पकड़ता हूं और उन्हें अपनी परियोजना में शामिल करता हूं। broadcastReceiver वर्ग SmsMessageSmsCbMessage की जगह को छोड़कर तुम्हारा रूप में ही है:

public class CbReceiver extends BroadcastReceiver { 

    @Override 
    public void onReceive(Context context, Intent intent) { 
     //---get the CB message passed in--- 
     Bundle bundle = intent.getExtras();   
     SmsCbMessage[] msgs = null; 
     String str = "";    
     if (bundle != null) { 
      //---retrieve the SMS message received--- 
      Object[] pdus = (Object[]) bundle.get("pdus"); 
      msgs = new SmsCbMessage[pdus.length];    
      for (int i=0; i<msgs.length; i++) { 
       msgs[i] = SmsCbMessage.createFromPdu((byte[])pdus[i]);     
       str += "CB lang " + msgs[i].getLanguageCode();      
       str += " :"; 
       str += msgs[i].getMessageBody().toString(); 
       str += "\n";   
      } 
      //---display the new CB message--- 
      abortBroadcast(); 
      Toast.makeText(context, str, Toast.LENGTH_SHORT).show(); 
     }       
    } 
} 

ऊपर रिसीवर के साथ मेरी एसजीएस फोन में अपने आवेदन को स्थापित करने, और फोन एसएमएस आवेदन में सीबी संदेश प्राप्त सक्रिय करने के बाद, मेरे ऐप था मानक एसएमएस एप्लिकेशन द्वारा प्राप्त करने के साथ समानांतर में टोस्ट में सीबी संदेशों को दिखाने में सक्षम।

  • कैसे अक्षम सक्षम करने के लिए/मेरी आवेदन में सीबी संदेशों के/configure_channels:

    मुद्दों अभी भी हल किया जाना आवश्यक हैं? एसएमएस ऐप getCbSettings()/setCbSettings() फ़ंक्शन, का उपयोग करता है लेकिन मुझे उन्हें नहीं मिला। तो अस्थायी रूप से मैंने इसके लिए अन्य ऐप का इस्तेमाल किया।

  • कैसे करें बीच में बंद करें सीबी संदेश प्रसारण, तो अन्य एप्लिकेशन उन्हें प्राप्त नहीं है? यह लगता abortBroadcast() यहाँ काम नहीं करता, क्योंकि प्रसारण संदेश (isOrderedBroadcast() रिटर्न false) का आदेश दिया नहीं है।
+0

धन्यवाद, लेकिन दुर्भाग्यवश यह मेरे मामले में काम नहीं करता है। क्या आपके पास मेनिफेस्ट में कोई अनुमति है? – VVS

+0

कोई विशेष अनुमति नहीं, केवल 'android.permission.RECEIVE_SMS'। इसके अलावा मुझे मानक एसएमएस एप्लिकेशन में सीबी प्राप्त करना भी सक्षम था। – GrAnd

+0

एचटीसी डिजायर स्टैंड स्टैंड एसएमएस एप्लिकेशन में कोई सीबी सेटिंग्स नहीं है। इसे केवल सामान्य फोन सेटिंग्स से ही सक्षम किया जा सकता है। तो ... ऐसा लगता है कि यह सिर्फ सैमसंग गैलेक्सी एस के लिए है, वैसे भी धन्यवाद। – VVS

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