آموزش ارسال و دریافت پیامک در اندروید
حتما برنامه های زیادی را دیده اید که با سرویس پیامکی تلفن همراه شما کار میکنند. برای مثال پیام رسان تلگرام ، واتس اپ و موارد زیاد دیگر که موقع نصب ، اجازهی استفاده از سرویس پیامکی را میخواهند تا هنگام ارسال کد امنیتی ، به صورت خودکار عملیات اعتبار سنجی انجام شود.
در این مقاله میخواهیم یک برنامه برای ارسال و دریافت پیامک بسازیم و ببینیم که به چه صورت کار میکند.
برای ارسال پیامک میتوانیم از ۲ روش استفاده کنیم. روش اول استفاده از Intent هست و روش دوم استفاده از SmsManager میباشد. روش به کار رفته در این مقاله ، استفاده از Intent میباشد. میتوانید اختلاف این دو مورد را در این مقاله ببینید.
در قدم اول یک پروژه میسازیم و فایل activity_main.xml را به activity_sms.xml تغییر میدهیم و کد زیر را در آن کپی میکنیم.
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent"> <TextView android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_margin="10dp" android:textSize="20dp" android:text="Enter the phone number of recipient"/> <EditText android:inputType="phone" android:id="@+id/edtPhoneNo" android:textSize="16dp" android:hint="add phone number" android:layout_marginLeft="10dp" android:layout_height="wrap_content" android:layout_width="match_parent"/> /> <TextView android:layout_width="match_parent" android:layout_height="wrap_content" android:textSize="20dp" android:layout_marginLeft="10dp" android:text="Message"/> /> <EditText android:hint="Write your message " android:textSize="14dp" android:layout_marginLeft="10dp" android:id="@+id/edtMessage" android:layout_width="match_parent" android:layout_height="150dp" android:gravity="top" /> <Button android:id="@+id/btnSendSMS" android:layout_width="match_parent" android:layout_height="54dp" android:text="Send SMS" android:layout_marginRight="10dp" android:layout_marginLeft="10dp" android:background="#00aaaa" android:gravity="center" android:textSize="16dp" /> </LinearLayout>
حالا ActivityMain.java را به ActivitySMS.java تغییر میدهیم و کد زیر را در آن کپی میکنیم.
package com.ghorbi.ahmad.sendreceivesms; import android.content.Intent; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.view.View; import android.widget.Button; import android.widget.EditText; public class ActivitySMS extends AppCompatActivity { EditText edtPhoneNumber; EditText edtMessage; Button btnSend; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_sms); edtPhoneNumber = (EditText) findViewById(R.id.edtPhoneNo); edtMessage = (EditText) findViewById(R.id.edtMessage); btnSend = (Button) findViewById(R.id.btnSendSMS); btnSend.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { String body = edtMessage.getText().toString(); String tel = edtPhoneNumber.getText().toString(); if(!tel.equals("")) sendSMS(body,tel); else Toast.makeText(ActivitySMS.this,"set phone number!",Toast.LENGTH_LONG); } }); } private void sendSMS(String body , String tel){ Intent smsIntent = new Intent(android.content.Intent.ACTION_VIEW); smsIntent.setType("vnd.android-dir/mms-sms"); smsIntent.putExtra("address", tel); smsIntent.putExtra("sms_body",body); startActivity(smsIntent); } }
در کد بالا متد sendSMS را داریم که با استفاده از Intent به برنامهی پیامک ارجاع میدهیم.
حالا میخواهیم کد مربوط به دریافت پیامک را بنویسیم. یک کلاس به اسم SmsReceiver.java و از BroadcastReceiver ارث بری میکنیم.(کد زیر را در آن کپی کنید)
package com.ghorbi.ahmad.sendreceivesms; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.os.Bundle; import android.telephony.SmsMessage; import android.util.Log; /** * Created by ahmad-sw on 06/03/2017. */ public class SmsReceiver extends BroadcastReceiver { public SmsReceiver() { } @Override public void onReceive(Context context, Intent intent) { Bundle bundle = intent.getExtras(); if (bundle != null) { Object[] pdus = (Object[]) bundle.get("pdus"); final SmsMessage[] messages = new SmsMessage[pdus.length]; for (int i = 0; i < pdus.length; i++) { messages[i] = SmsMessage.createFromPdu((byte[]) pdus[i]); } StringBuffer content = new StringBuffer(); if (messages.length > 0) { for (int i = 0; i < messages.length; i++) { content.append(messages[i].getMessageBody()); } } String mySmsText = content.toString(); Log.e("TagSms : " ,"body" + mySmsText); } } }
در کد بالا یک intent را در متد onReceive دریافت میکنیم و با کد زیر bundle آن را استخراج میکنیم.
Bundle bundle = intent.getExtras();
اگر bundle مقدار null نداشت میتوانیم “pdu” را از آن استخراج کنیم. pdu (یا protocol data unit) یک فرمت صنعتی برای پیامک (sms) است. طبق استاندارد هر زبان (برای فارسی یا انگلیسی یا … ) مقدار حروف خاصی یک پیامک را تشکیل میدهند.
برای مثال در پیامک به زبان فارسی ، ۷۰ حرف (اعم از فاصله و نقطه و … ) یک پیامک را تشکیل میدهند. اگر شما بیشتر از ۷۰ حرف استفاده کنید (تا ۶۴ کاراکتر دیگر ) در واقع ۲ پیامک یا به بیان بهتر ۲ pdu را نوشته اید و ارسال میکنید.(هر pdu فقط یک شی است و نوع دادهی خاصی نیست).
حالا به تعداد pdu ها ، آرایه ای از SmsMessage ها میسازیم .
final SmsMessage[] messages = new SmsMessage[pdus.length];
از شی های ساخته شده از pdu ها SmsMessage میسازیم و در نهایت متن پیام ها را در قالب string به هم متصل میکنیم و محتوای پیام را میسازیم.
for (int i = 0; i < pdus.length; i++) { messages[i] = SmsMessage.createFromPdu((byte[]) pdus[i]); } StringBuffer content = new StringBuffer(); if (messages.length > 0) { for (int i = 0; i < messages.length; i++) { content.append(messages[i].getMessageBody()); } }
کد زیر را نیز در AndroidManifest.xml کپی میکنیم.
<?xml version="1.0" encoding="utf-8"?> <manifest package="com.ghorbi.ahmad.sendreceivesms" xmlns:android="http://schemas.android.com/apk/res/android"> <uses-permission android:name="android.permission.RECEIVE_SMS" /> <application android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:supportsRtl="true" android:theme="@style/AppTheme"> <activity android:name=".ActivitySMS"> <intent-filter> <action android:name="android.intent.action.MAIN"/> <category android:name="android.intent.category.LAUNCHER"/> </intent-filter> </activity> <receiver android:name=".SmsReceiver" android:enabled="true" android:exported="true"> <intent-filter android:priority="999"> <action android:name="android.provider.Telephony.SMS_RECEIVED" /> </intent-filter> </receiver> </application> </manifest>
امیدوارم از این آموزش لذت برده باشید.میتوانید سوالات خود را در قسمت نظرات مطرح کنید.
موفق باشید.
مطالب زیر را حتما مطالعه کنید
آموزش Gradle – اهمیت Project Automation
درک مفهوم کدنویسی تمیز در اندروید
5 هک ساده برای کاهش سایز فایل APK
آشنایی با RecyclerView در اندروید
Open/Closed Principle در قوانین Solid
توابع در زبان برنامه نویسی Kotlin
4 Comments
Join the discussion and tell us your opinion.
دیدگاهتان را بنویسید لغو پاسخ
برای نوشتن دیدگاه باید وارد بشوید.
سلام من میخوام بخشی از یک اپ اندروید رو مثلا قسمت انبار داری رو به صورت مجزا داخل برنامه برا فروش بزارم ( مثل کاری که نرم افزار هلو انجام داده و میشه ماژول ها رو جدا خرید کرد و بعد خرید به برنامه اضافه میشه) ممنون میشم راهنماییم کنین
سلام دوست عزیز.
این فرایند به این صورته که شما دسترسی به اون بخش رو با استفاده از sharedPreferences میبندین.
وقتی کاربر خواست اون رو باز کنه به یک درگاه پرداخت معرفی میشه و بعد از پرداخت بانک به سرور شما میگه که پرداخت انجام شده و شما در سرور اون رو ثبت میکنید و برای کاربر نیز میفرستید.
اطلاعات دریافت شده توسط نرم افزار رو بررسی میکنید و در صورت نیاز اون قفل های ایجاد شده توسط sharedPreferences رو باز میکنید.
لطفا دفعات بعد سعی کنید سوالات خودتون رو در انجمن مطرح کنید تا دیگر عزیزان هم بتونن جواب بدن و اطلاعاتشون رو به اشتراک بگذارند.
موفق باشید.
برای انجام روش SmsManager چجوری باید عمل کنیم؟
و اینکه برای هر اپی روند همینه چه پیام رسان چه کاربردی و …؟
دلیل استفاده از روش activity در این اموزش این بود که ما به permission نیازی نداریم و کاربر هم ترس نداره که این برنامه معلوم نیست چه پیامکی رو قراره بفرسته و هزینه ی منو بالا ببره و ….
توصیه میشه حتی الامکان از همین روش استفاده کنیم که برنامه هامون قابل اعتماد کاربر باشه.
اگر منظورتون برنامه ی ارسال و دریافت پیامک هست این روش کارآمد نیست و باید از smsManager استفاده کنیم. در غیر اینصورت میتوان از این روش استفاده کرد. البته بازم با توجه به نوع برنامه و حساسیت اطلاعات ارسالی این تصمیم گیری متفاوت خواهد بود.
—————————————————————————
برای استفاده از smsManager اول باید داخل manifest این permission رو وارد کنید.
“android.permission.SEND_SMS”
کد جاوا نیز به صورت زیر است.
SmsManager smsManager = SmsManager.getDefault();
smsManager.sendTextMessage("phoneNo", null, "sms message", null, null);