تحلیل ارسال و دریافت SMS در اندروید
دارالترجمه رسمی
دارالترجمه رسمی پارسیس شامل خدمات ترجمه رسمی و تخصصی در بیش از 60 زبان زنده دنیا
دارالترجمه رسمی پارسیس شامل خدمات ترجمه رسمی و تخصصی در بیش از 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 شده باشد )
نظرات و سوالات کاربران
لطفا" در رابطه با چگونگی شمسی نمودن تاریخ ارسال و دریافت اس ام اس در گوشیهای آندرویدی توضیح بفرمایید.
با تشکر
ممنون از اموزشتون...
برای اطلاع از وضعیت پیام باید از pending intent استفاده کنیم درست...ولی وقتی من به یک شماره که خاموشه چندتا پیام ارسال کنم و همش بعد از روشن شدن گوشی طرف تحویل بده چطور بفهمم کدوم پیام تحویل داده و کدوم داده نشده؟
ممنونم پارسا جان :)
آموزشت خیلی خوبه محمد، ادامه بده :)