تحلیل ارسال و دریافت SMS در اندروید

تحلیل ارسال و دریافت SMS در اندروید
ارسال و دریافت SMS از بخش های مهم یک برنامه ی اندرویدی محسوب میشود، برای مثال میتوانید در اپلیکیشن خود دکمه ای برای ارسال متون مختلف از طریق SMS قرار دهید، یا زمانی که گوشی کاربر SMS ای دریافت کرد میتوانید محتوای آن SMS و شماره فرستنده و ... را بخوانید، با مجیدآنلاین در این مقاله همراه باشید.
دارالترجمه رسمی
دارالترجمه رسمی پارسیس شامل خدمات ترجمه رسمی و تخصصی در بیش از 60 زبان زنده دنیا
افزونه های سئو وردپرس
بهترین افزونه های سئو وردپرس به صورت کاملا فارسی
افزونه فرم ساز آسان
فرم ساز آسان اولین فرم ساز کاملا فارسی وردپرس
خرید ورق گالوانیزه رنگی
خرید انواع ورق گالوانیزه رنگی با بهترین قیمت
کارگاه رویه کوبی در تهران
بهترین کارگاه رویه کوبی و تعمیر مبل راحتی و استیل در تهران با قیمت و کیفیت عالی
بلیط هواپیما مشهد تهران
خرید بلیط هواپیما مشهد تهران
خودتان را اینجا معرفی کنید

پیش نیاز : تسلط نسبت به مفاهیم ابتدایی برنامه نویسی اندروید

تحلیل SMS های دریافتی

در این مثال یاد میگیریم که چطور SMS های دریافتی را تحلیل کنیم و برای مثال متن درون آن و شماره تلفن فرستنده را بدست آوریم، نیاز به یک کلاس گیرنده یا receiver class داریم که از کلاس BroadcastReceiver ارث میبرد، ابتدا اجازه ی دسترسی رسیور را در فایل manifest مینویسیم :
<uses-permission android:name="android.permission.RECEIVE_SMS">
همچنین در فایل manifest باید receiver مورد نظرمان را تعریف کنیم :
<receiver android:name=".SmsReceiver">
            <intent-filter>
                <action android:name=
                    "android.provider.Telephony.SMS_RECEIVED" />
            </intent-filter>

 </receiver>
در نهایت فایل manifest ما به صورت زیر میشود :
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
      package="net.learn2develop.SMSMessaging"
      android:versionCode="1"
      android:versionName="1.0.0">

 
<uses-permission android:name="android.permission.RECEIVE_SMS"> in manifest file
 <application android:icon="@drawable/icon" android:label="@string/app_name">
        <activity android:name=".SMS"
                  android:label="@string/app_name">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>        
 
        <receiver android:name=".SmsReceiver">
            <intent-filter>
                <action android:name=
                    "android.provider.Telephony.SMS_RECEIVED" />
            </intent-filter>
        </receiver>
 
    </application>
    <!-- Permission to Receive SMS  -->
    <uses-permission android:name="android.permission.RECEIVE_SMS">
    </uses-permission>
</manifest>
سپس کلاس SMSReceiver را تعریف میکنیم :
public class SmsReceiver extends BroadcastReceiver
{
    @Override
    public void onReceive(Context context, Intent intent)
    {
        //---get the SMS message passed in---
        Bundle bundle = intent.getExtras();        
        SmsMessage[] msgs = null;
        String messageReceived = "";            
        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]);                
                messageReceived += msgs[i].getMessageBody().toString();
                messageReceived += "n";        
            }
            //نشان دادن رسیدن مسیج جدید
            Toast.makeText(context, messageReceived, Toast.LENGTH_SHORT).show();
            // گرفتن شماره تلفن فرستنده
           String senderPhoneNumber=msgs[0].getOriginatingAddress ();   
       }                         
    }
}
همانطور که در قطعه کد بالا به وضوح مشخص است، برای گرفتن شماره تلفن فرستنده از قطعه کد زیر استفاده کردیم :
msgs[0].getOriginatingAddress ()

ارسال SMS

در ابتدا باید اجازه ی انجام این کار را از فایل manifest اخذ کنیم، بنابراین مینویسیم :
<uses-permission android:name="android.permission.SEND_SMS">
در نهایت فایل manifest ما باید به صورت زیر شود :
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
      package="net.learn2develop.SMSMessaging"
      android:versionCode="1"
      android:versionName="1.0.0">
    <application android:icon="@drawable/icon" android:label="@string/app_name">
        <activity android:name=".SMS"
                  android:label="@string/app_name">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>
    <uses-permission android:name="android.permission.SEND_SMS">
    </uses-permission>
    <uses-permission android:name="android.permission.RECEIVE_SMS">
    </uses-permission>
</manifest>
یک لایه مانند زیر میسازیم :
که قطعه کد آن به صورت زیر میشود :
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >

    <TextView
        android:layout_width="fill_parent"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_height="wrap_content"
        android:text="Enter the phone number of recipient"
        android:text="Enter the phone number of recipient" />

    <EditText
        android:id="@+id/txtPhoneNo"
        android:id="@+id/txtPhoneNo"
        android:layout_width="fill_parent"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_height="wrap_content" />

    <TextView
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="Message" />
android:layout_width="fill_parent"android:layout_height="wrap_content"android:text="Message"

    <EditText
        android:id="@+id/txtMessage"
        android:id="@+id/txtMessage"
        android:layout_width="fill_parent"
        android:layout_width="fill_parent"
        android:layout_height="150px"
        android:layout_height="150px"
        android:gravity="top"
        android:gravity="top" />

    <Button
        android:id="@+id/btnSendSMS"
        android:id="@+id/btnSendSMS"
        android:layout_width="fill_parent"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_height="wrap_content"
        android:text="Send SMS"
        android:text="Send SMS" />

</LinearLayout>
یک کلاس به اسم SMS میسازیم و در آن مینویسیم :
public class SMS extends Activity
{
    Button btnSendSMS;
    EditText txtPhoneNo;
    EditText txtMessage;
 
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);        
 
        btnSendSMS = (Button) findViewById(R.id.btnSendSMS);
        txtPhoneNo = (EditText) findViewById(R.id.txtPhoneNo);
        txtMessage = (EditText) findViewById(R.id.txtMessage);
 
        btnSendSMS.setOnClickListener(new View.OnClickListener()
        {
            public void onClick(View v)
            {                
                String phoneNo = txtPhoneNo.getText().toString();
                String message = txtMessage.getText().toString();                 
                if (phoneNo.length()>0 && message.length()>0)                
                    sendSMS(phoneNo, message);                
                else
                    Toast.makeText(getBaseContext(),
                        "Please enter both phone number and message.",
                        Toast.LENGTH_SHORT).show();
            }
        });        
    }  
برای ارسال یک SMS، از کلاس SmsManager استفاده میکنیم، برخلاف بقیه کلاس ها لازم نیست این کلاس را مستقیما معرفی کنید، بجای آن میتوانید متد getDefault را فراخوانی کنید تا یک شی از SMSManager داشته باشید، متد sendTextMessage از طریق PendingIntent اس ام اس را ارسال میکند، شی PendingIntent یک هدف را شناسایی میکند تا بعدا آن را فراخوانی کند، برای مثال پس از ارسال SMS میتوانید از PendingIntent استفاده کنید تا یک اکتیویتی دیگری را نمایش دهید، در این مقال شی PendingIntent به اکتیویتی SMS.java اشاره میکند بنابراین بعد از ارسال SMS اتفاقی نمی افتد.
اگر میخواهید که روند ارسال SMS را مانیتور کنید میتوانید از 2 تا PendingIntent و 2 تا BroadcastReceiver استفاده کنید، مانند زیر :
private void sendSMS(String phoneNumber, String message)
    {        
        String SENT = "SMS_SENT";
        String DELIVERED = "SMS_DELIVERED";
 
        PendingIntent sentPI = PendingIntent.getBroadcast(this, 0,
            new Intent(SENT), 0);
 
        PendingIntent deliveredPI = PendingIntent.getBroadcast(this, 0,
            new Intent(DELIVERED), 0);
 
        //---when the SMS has been sent---
        registerReceiver(new BroadcastReceiver(){
            @Override
            public void onReceive(Context arg0, Intent arg1) {
                switch (getResultCode())
                {
                    case Activity.RESULT_OK:
                        Toast.makeText(getBaseContext(), "SMS sent",
                                Toast.LENGTH_SHORT).show();
                        break;
                    case SmsManager.RESULT_ERROR_GENERIC_FAILURE:
                        Toast.makeText(getBaseContext(), "Generic failure",
                                Toast.LENGTH_SHORT).show();
                        break;
                    case SmsManager.RESULT_ERROR_NO_SERVICE:
                        Toast.makeText(getBaseContext(), "No service",
                                Toast.LENGTH_SHORT).show();
                        break;
                    case SmsManager.RESULT_ERROR_NULL_PDU:
                        Toast.makeText(getBaseContext(), "Null PDU",
                                Toast.LENGTH_SHORT).show();
                        break;
                    case SmsManager.RESULT_ERROR_RADIO_OFF:
                        Toast.makeText(getBaseContext(), "Radio off",
                                Toast.LENGTH_SHORT).show();
                        break;
                }
            }
        }, new IntentFilter(SENT));
 
        //---when the SMS has been delivered---
        registerReceiver(new BroadcastReceiver(){
            @Override
            public void onReceive(Context arg0, Intent arg1) {
                switch (getResultCode())
                {
                    case Activity.RESULT_OK:
                        Toast.makeText(getBaseContext(), "SMS delivered",
                                Toast.LENGTH_SHORT).show();
                        break;
                    case Activity.RESULT_CANCELED:
                        Toast.makeText(getBaseContext(), "SMS not delivered",
                                Toast.LENGTH_SHORT).show();
                        break;                        
                }
            }
        }, new IntentFilter(DELIVERED));        
 
        SmsManager sms = SmsManager.getDefault();
        sms.sendTextMessage(phoneNumber, null, message, sentPI, deliveredPI);        
    }  
کد بالا از طریق PendingIntent روند اجرای SMS را مانیتور میکند، زمانی که یک SMS ارسال میشود، onReceive اولین BroadcastReceiver فعال میشود، اینجا مکانی است که میتوانید وضعیت ارسال SMS را ببینید، دومین شی PendingIntent وضعیت رسیدن SMS را بررسی میکند ( منظور delivery است ) دومین BroadcastReceiver زمانی فعال میشود که SMS به خوبی به مقصد رسیده باشد ( deliver شده باشد )

محمد یه دانشجوی فناوری اطلاعات هست که از سال 92 فعالیتش رو شروع کرد، در حال حاضر در زمینه ی برنامه نویسی تحت وب و اندروید و شبکه های ارتباطی سیسکو فعالیت میکنه .

نظرات و سوالات کاربران

ارسال پاسخ انصاری
انصاری
چهارشنبه ۱۶ خرداد ۱۳۹۷ ۲۳:۲۵
سلام آقای بابازاده
لطفا" در رابطه با چگونگی شمسی نمودن تاریخ ارسال و دریافت اس ام اس در گوشیهای آندرویدی توضیح بفرمایید.
با تشکر
ارسال پاسخ فاطمه اسدی
فاطمه اسدی
پنج شنبه ۰۸ تیر ۱۳۹۶ ۱۳:۱۵
من یک اپلیکیشن درست کردم ک دارای یک اکتیویتی است ک دارای 9 باتن در صفحه است. این باتن ها را شماره گذاری کرده ام.هر گاه یکی از باتن ها کلیک شد شماره باتن به یک مخاطب خاص ارسال میشود. این اکتیویتی بخوبی کار میکند. اما من در اپلیکیشن نیاز ب اکتیویتی دیگری دارم ک بتواند از آن مخاطب اس ام اس دریافت کند وشماره ای را از آن دریافت کند.بعد اپلیکیشن باید نمره ارسالی من را با آن نمره ارسالی از آن مخاطب مقایسه کند.اگر دو نمره مساوی بودند پیغام اوکی و اگر مساوی نبودند پیغغام نوکی را چاپ کند بهمراه اس ام اس ارسالی و دریافتی لطفا کمک کنید
ارسال پاسخ اول راه
اول راه
جمعه ۲۰ فروردین ۱۳۹۵ ۲۲:۴۶
سلام خسته نباشین.
ممنون از اموزشتون...
برای اطلاع از وضعیت پیام باید از pending intent استفاده کنیم درست...ولی وقتی من به یک شماره که خاموشه چندتا پیام ارسال کنم و همش بعد از روشن شدن گوشی طرف تحویل بده چطور بفهمم کدوم پیام تحویل داده و کدوم داده نشده؟
ارسال پاسخ محمد بابازاده
محمد بابازاده
جمعه ۱۵ خرداد ۱۳۹۴ ۰۰:۱۶
در پاسخ به دیدگاه Parsa Kafi ارسال شده در دوشنبه ۱۱ خرداد ۱۳۹۴ ۱۵:۰۰

آموزشت خیلی خوبه محمد، ادامه بده :)

ممنونم پارسا جان :)

ارسال پاسخ Parsa Kafi
Parsa Kafi
دوشنبه ۱۱ خرداد ۱۳۹۴ ۱۵:۰۰

آموزشت خیلی خوبه محمد، ادامه بده :)