एंड्रॉइड: एसएमएस प्रोसेसिंग

0. ज्वाइन करने के बजाय


समय-समय पर (जब मेरे पास एक शाम होती है और हमारा "क्लब" खेल का आयोजन करता है) मैं रगबॉल खेलता हूं। "क्लब" इस तरह से आयोजित किया जाता है कि खेल के दिन सभी प्रतिभागियों को निम्न प्रकार के एसएमएस प्राप्त होते हैं:

! 19-30. №30: . , 20. . . 8 (951) ***-**-**.

और इसलिए मैंने सोचा - क्यों न एक छोटा सा आवेदन लिखा जाए जो इन संदेशों को पकड़ कर उन्हें Google कैलेंडर में अंकित कर दे। क्यों? हां, मूल रूप से, सिर्फ मनोरंजन के लिए, क्योंकि मैं इतना व्यस्त व्यक्ति नहीं हूं कि स्वचालित सचिव मेरे लिए महत्वपूर्ण हैं।

तो, आवेदन निम्नलिखित करने में सक्षम हो जाएगा:

लेख के भाग के रूप में, मेरा मानना ​​है कि पाठक को बुनियादी ज्ञान है - एक प्रोजेक्ट कैसे बनाया जाए, एक मैनिफ़ेस्ट फ़ाइल क्या है, और सामान्य रूप से एंड्रॉइड के लिए विकसित करना कहां शुरू करना है - इस विषय पर बहुत सारे अलग-अलग ट्यूटोरियल हैं, और हम यहां नहीं रुकेंगे। उसी समय, लेख उन्नत एंड्रॉइड डेवलपर्स के लिए अभिप्रेत नहीं है, यह काफी बुनियादी चीजों पर विचार करेगा, जैसे कि निगरानी और प्रसंस्करण एसएमएस, डेटाबेस के साथ काम करना और HTTP के माध्यम से कनेक्ट करना।

तो चलिए शुरू करते हैं। वैसे, एसडीके का उपयोग किया गया संस्करण 14 (एंड्रॉइड 4.0) है।

1. हम एसएमएस को रोकते हैं


आने वाले एसएमएस की निगरानी करने के लिए, पहली चीज जो हमें करने की आवश्यकता है, उन्हें प्राप्त करने के लिए अनुमति का अनुरोध करना है। ऐसा करने के लिए, प्रपत्र की प्रविष्टि AndroidManifest.xml फ़ाइल में जोड़ें:

 <uses-permission android:name="android.permission.RECEIVE_SMS" /> 


अगला कदम आने वाले संदेशों को सुनने के लिए एक मॉनिटर को लागू करना है। ऐसा करने के लिए, प्रकट फ़ाइल में रिसीवर पंजीकृत करें:

 <receiver android:name="SMSMonitor"> <intent-filter android:priority="100"> <action android:name="android.provider.Telephony.SMS_RECEIVED"/> </intent-filter> </receiver> 


यहां हमने प्राथमिकता को 100 पर सेट किया है ताकि हमारे आवेदन को मानक एसएमएस हैंडलर से पहले आने वाले एसएमएस तक पहुंच प्राप्त हो, जिसमें शून्य प्राथमिकता हो। हमारे आवेदन संदेश को संसाधित करने के बाद, इसे सिस्टम में देने और इसे इनबॉक्स में रखने का कोई मतलब नहीं है।

अब एक ऐसा वर्ग बनाएं जो BroadcastReceiver विस्तार करे:

 public class SMSMonitor extends BroadcastReceiver { private static final String ACTION = "android.provider.Telephony.SMS_RECEIVED"; @Override public void onReceive(Context context, Intent intent) { } } 


यह वर्ग अमूर्त onReceive() पद्धति को लागू करता है, जिसे हर बार संदेश प्राप्त होने पर सिस्टम द्वारा बुलाया जाता है। विधि में हम लिखते हैं:

 if (intent != null && intent.getAction() != null && ACTION.compareToIgnoreCase(intent.getAction()) == 0) { Object[] pduArray = (Object[]) intent.getExtras().get("pdus"); SmsMessage[] messages = new SmsMessage[pduArray.length]; for (int i = 0; i < pduArray.length; i++) { messages[i] = SmsMessage.createFromPdu((byte[]) pduArray[i]); } } 


यहाँ हमें intent.getExtras().get("pdus") का एक संदेश मिलता है intent.getExtras().get("pdus") , जो PDU प्रारूप में वस्तुओं की एक सरणी लौटाती है - हम फिर इन वस्तुओं को createFromPdu() विधि का उपयोग करके SmsMessage करते हैं।

अब ध्यान दो। संदेश प्राप्त करने के बाद हम जो करते हैं, उसे जल्दी से निष्पादित किया जाना चाहिए। प्रसारण रिसीवर को सिस्टम में उच्च प्राथमिकता मिलती है, लेकिन यह पृष्ठभूमि में काम करता है और इसे थोड़े समय में निष्पादित किया जाना चाहिए, इसलिए हमारी क्षमताएं सीमित हैं। उदाहरण के लिए, हम एक अधिसूचना तैयार कर सकते हैं या उसमें प्रसंस्करण जारी रखने के लिए एक सेवा शुरू कर सकते हैं। इसलिए, हम संदेश भेजने वाले की जांच करेंगे, और यदि यह गेम के बारे में सूचना है, तो हम संदेश पाठ को बाहर निकालेंगे और सेवा शुरू करेंगे, जिसमें हम पहले ही इस संदेश को संसाधित कर देंगे।

हम onReceive() विधि में जोड़ते हैं:

 String sms_from = messages[0].getDisplayOriginatingAddress(); if (sms_from.equalsIgnoreCase("RM FIGHT")) { StringBuilder bodyText = new StringBuilder(); for (int i = 0; i < messages.length; i++) { bodyText.append(messages[i].getMessageBody()); } String body = bodyText.toString(); Intent mIntent = new Intent(context, SmsService.class); mIntent.putExtra("sms_body", body); context.startService(mIntent); abortBroadcast(); } 


यहां हम संदेश के पाठ की रचना करते हैं (मामले में जब संदेश लंबा था और कई एसएमएस में आ गया था, प्रत्येक व्यक्तिगत भाग messages[i] में संग्रहीत होता है messages[i] ) और हम अन्य अनुप्रयोगों के साथ संदेश के आगे के प्रसंस्करण को रोकने के लिए abortBroadcast() विधि कहते हैं।

2. हम एसएमएस की प्रक्रिया करते हैं


पिछले पैराग्राफ में, हम इस तथ्य पर बसे थे कि हम स्टार्टअप सेवा के लिए सेवा शुरू करते हैं जो स्टार्ट सर्विस startService() पद्धति का उपयोग करते हैं। वास्तव में, क्या सेवाएं हैं और वे क्या खाते हैं, आधिकारिक वेबसाइट पर अच्छी तरह से वर्णित है, इसलिए हम यहां नहीं रुकेंगे।

Service वर्ग का विस्तार करने वाला वर्ग Service बनाएँ:

 public class SmsService extends Service { @Override public IBinder onBind(Intent intent) { return null; } } 


चूंकि हमारे पास एक स्थानीय सेवा है, इसलिए ऑनबिंद () विधि शून्य है।

सूचनाएं प्रदर्शित करने के लिए, हमें showNotification () सहायक विधि की आवश्यकता है:

 private void showNotification(String text) { PendingIntent contentIntent = PendingIntent.getActivity(this, 0, new Intent(this, MainActivity.class), 0); Context context = getApplicationContext(); Notification.Builder builder = new Notification.Builder(context) .setContentTitle("Rugball") .setContentText(text) .setContentIntent(contentIntent) .setSmallIcon(R.drawable.ic_launcher) .setAutoCancel(true); NotificationManager notificationManager = (NotificationManager)context.getSystemService(Context.NOTIFICATION_SERVICE); Notification notification = builder.getNotification(); notificationManager.notify(R.drawable.ic_launcher, notification); } 


onStartCommand() विधि में, onStartCommand() लिखते हैं:

 @Override public int onStartCommand(Intent intent, int flags, int startId) { String sms_body = intent.getExtras().getString("sms_body"); showNotification(sms_body); return START_STICKY; } 


यह वास्तव में, smsProcess() पद्धति को लागू करने के लिए बना रहता है, जो डेटाबेस में एसएमएस को जोड़ देगा और Google कैलेंडर में एक घटना का निर्माण करेगा। यह हम लेख के अगले भाग में करेंगे।

अद्यतन: GitHub पर कोड पोस्ट किया गया। मेरे पास लेख के दूसरे भाग के साथ समय नहीं है, यह काम के लिए बहुत व्यस्त है। मैं जल्द ही इस मुद्दे से निपटने की उम्मीद करता हूं।

Source: https://habr.com/ru/post/In149555/


All Articles