پیام ها (اس ام اس) در اندروید (Messaging)
بسم الله الرحمن الرحیم
پیام ها (اس ام اس) در اندروید (Messaging)
فصل هشتم
آنچه شما در پایان فصل یاد می گیرید:
بسم الله الرحمن الرحیم
پیام ها (اس ام اس) در اندروید (Messaging)
فصل هشتم
آنچه شما در پایان فصل یاد می گیرید:
- یاد می گیرید که چگونه در برنامه خود از طریق برنامه نویسی SMS ارسال کنید
- چگونه از طریق از طریق برنامه از قبل ساخته شده Message Application پیغام ارسال کنید.
- چگونه یک پیغام SMS را دریافت کنید
- چگونه یک ایمیل از طریق برنامه ارسال کنید
زمانی که شما یک برنامه اندروید ایجاد می کنید ممکن شما بخواهید با جهان خارج هم ارتباط برقرار کنید مثلا می خواهید زمانی که یک اتفاق خاص افتاد پیامی به تلفنی دیگر ارسال کند مثلا زمانی که به یک مکان خاص رسیدیم.
در این قسمت شما یاد می گیرید که چگونه یک پیام ارسال و دریافت کنید و یاد می گیرید که چگونه برنامه ارسال ایمیل را در برنامه خود به کار گیرید و یک ایمیل را به دیگر کاربران ارسال کنید
ارسال SMS
پیام ها از قسمت های اصلی موبایل شما می باشند. برای کاربران پیام ها نقش اساسی را بازی می کنند.تقریبا تمام استفاده کننده ازتلفن همراه قادر به ارسال و دریافت پیام می باشند. اندروید در داخل خودش دارای یک برنامه ارسال پیام می باشد ک به شما اجازه ارسال و دریافت پیام را می دهد. با این حال شما می توانید چنین امکاناتی را به برنامه خود اضافه کنید
به عنوان مثال شما می خواهدی برنامه بنویسید که سر زمان مشخص پیامی را دریافت کند. مکان فرزند خود را را هر 30 دقیقه به شما از طرق پیام به شما داده شود. به عنوان مثال اگر قرا بود به کتاب خانه برود ولی به سینما یا پارک رفت شما از طرق پیام ارسال شده متوجه می شوید که مکان آن کجاست !!!
دراین قسمت نحوه ای دریافت و ارسال پیام ها از طرق برنامه هایتان شرح می دهیم.خبر خوب این است که شبیه ساز اندروید امکان ارسال پیام به شما می دهد.
ارسال پیام ها از طریق برنامه نویسی
در اینجا شما یاد میگیرید که چگوه می توان یه پیام را با برنامه نویسی در برنامه خود استفاده کنید برنامه را اجرا میکنید و کاربر بدون اینکه متوجه شود پیامی ارسال می شود
ابتدا یاد می گیریم که چگونه پیام ها را از طریق برنامه ارسال کنیم.
یک پروژه جدید به نام sms ایجاد کنید.
دستورات زیر رادر Main.Xml بنویسید.
<?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" >
<Button
android:id="@+id/btnSendSMS"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="Send SMS"
android:onClick="onClick" />
</LinearLayout>
دستورات زیر رادر فایل AndroidManifest.xml بنویسید.
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.mehrdadjavidi.SMS"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk android:minSdkVersion="14" />
<uses-permission android:name="android.permission.SEND_SMS"/>
<application
android:icon="@drawable/ic_launcher"
android:label="@string/app_name" >
<activity
android:label="@string/app_name"
android:name=".SMSActivity" >
<intent-filter >
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
دستورات زیر را در فایل SMSActivity.javوارد کنید
package com.mehrdadjavidi.SMS;
import android.app.Activity;
import android.os.Bundle;
import android.telephony.SmsManager;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
public class SMSActivity extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Button btn=(Button)findViewById(R.id.btnSendSMS);
btn.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
sendSMS("5556", "Helo My Friend");
}
});
}
//---sends an SMS message to another device---
private void sendSMS(String phoneNumber, String message)
{
SmsManager sms = SmsManager.getDefault();
sms.sendTextMessage(phoneNumber, null, message, null, null);
}
}
//---sends an SMS message to another device---
private void sendSMS(String phoneNumber, String message)
{
SmsManager sms = SmsManager.getDefault();
sms.sendTextMessage(phoneNumber, null, message, null, null);
}
برنامه را با زدن F11 اجرا کنید. سپس بر روی دکمه send Sms کلیک کنید
توضیحات برنامه:
در ابتدا برای اینکه بتوانیم از امکانات ارسال sms استفاده کنیم. بایدpermissions آن را در فایل
AndroidManifest.xml تعیین کنیم.
برای اسال پیام شما می توانید از کلاس SmsManager استفاده کنید. این کلاس بر خلاف دیگر کلاس ها شما نمی توانید به طور مستقیم یک نمونه شی از آن ایجاد گنید. شما باید متد استاتیک getDefault() را د کلاس SmsManager فراخوانی کنید.
شما از طریق می توانید متد sendTextMessage() پیام را ارسال کنید
//---sends an SMS message to another device---
private void sendSMS(String phoneNumber, String message)
{
SmsManager sms = SmsManager.getDefault();
sms.sendTextMessage(phoneNumber, null, message, null, null);
}
متد دارای sendTextMessage 5 پارامتر می باشد.
destinationAddress : شماره تلفن مقصد
scAddress آدرس ارائه دهنده سرویس پیام مقددار پیش فرض Null برای SMSC
text : متن پیام
sentIntent ایجاد هشداری برای پیامی که ارسال می شود
deliveryIntent ایجاد هشداری برای پیام های که به مقصد می رسد.
بازخورد گرفتم پس از ارسال پیام
از قسمت قبل یاد گرفتیم که چگونه پیام ارسال کنیم اما چگونه می توان اطمینان یافت که پیام درست ارسال شده است؟ برای این کار شما می توانی یک شی ایجاد PendingIntent کرد تا ارسال پیام را نظارت کند.
کد زیر نحوه ای انجام این کار را انجام می دهید فایل java را به صورت زیر تغییر دهید
package com.mehrdadjavidi.SMS;
import android.app.Activity;
import android.app.PendingIntent;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.Bundle;
import android.telephony.SmsManager;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.Toast;
public class SMSActivity extends Activity {
String SENT = "SMS_SENT";
String DELIVERED = "SMS_DELIVERED";
PendingIntent sentPI, deliveredPI;
BroadcastReceiver smsSentReceiver, smsDeliveredReceiver;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Button btnsen=(Button)findViewById(R.id.btnSendSMS);
btnsen.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
// TODO Auto-generated method stub
sendSMS("5556", "Helo My Friend");
}
});
sentPI = PendingIntent.getBroadcast(this, 0,
new Intent(SENT), 0);
deliveredPI = PendingIntent.getBroadcast(this, 0,
new Intent(DELIVERED), 0);
}
@Override
public void onResume() {
super.onResume();
//---create the BroadcastReceiver when the SMS is sent---
smsSentReceiver = 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;
}
}
};
//---create the BroadcastReceiver when the SMS is delivered---
smsDeliveredReceiver = 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;
}
}
};
//---register the two BroadcastReceivers---
registerReceiver(smsDeliveredReceiver, new IntentFilter(DELIVERED));
registerReceiver(smsSentReceiver, new IntentFilter(SENT));
}
@Override
public void onPause() {
super.onPause();
//---unregister the two BroadcastReceivers---
unregisterReceiver(smsSentReceiver);
unregisterReceiver(smsDeliveredReceiver);
}
//---sends an SMS message to another device---
private void sendSMS(String phoneNumber, String message)
{
SmsManager sms = SmsManager.getDefault();
sms.sendTextMessage(phoneNumber, null, message, sentPI, deliveredPI);
}
}
توضیحات
در متد onCreate() بالا دو شی PendingIntent ایجاد کردیم
sentPI = PendingIntent.getBroadcast(this, 0,
new Intent(SENT), 0);
deliveredPI = PendingIntent.getBroadcast(this, 0,
new Intent(DELIVERED), 0);
این دو شی برای ارسال بعدی استفاده می شود زمامی که پیام ارسال می شود(“SMS_SENT”) زمانی که پیام delivered می شود(SMS_DELIVERED)
در متد onResume(): شما دو BroadcastReceivers. ایجاد و ثبت کرده اید. این دو BroadcastReceivers گوش می دهند(Listen) برای intents کردن و تطبیق کردن “SMS_SENT” و “SMS_DELIVERED.
//---register the two BroadcastReceivers---
registerReceiver(smsDeliveredReceiver, new IntentFilter(DELIVERED));
registerReceiver(smsSentReceiver, new IntentFilter(SENT));
با هر BroadcastReceiver متد onReceive() , override می شود.
این دوشی به دو پارامتر آخر متد sendTextMessage() ارسال می شود
SmsManager sms = SmsManager.getDefault();
sms.sendTextMessage(phoneNumber, null, message, sentPI, deliveredPI)
در این حالت اگر پیام درست ارسال یا با خطا مواجه شود به شما هشدار می دهد.
ارسال پیام از طریق برنامه پیام اندروید
برخی اوقات که از یام رسان خود اندروید استفاده کنیم. تا اینکه خودمان برنامه را پیاده سازی کنیم.
برای فعال سازی پیام رسان اندروید در برنامه خود شما می تونید شی Intent با MIME از نوع “vnd.android-dir/mms-sms” استفاده کنید . که در ادامه آمده است.
Intent i = new
Intent(android.content.Intent.ACTION_VIEW);
i.putExtra("address", "5556; 5558; 5560");
i.putExtra("sms_body", "Hello my friends! ");
i.setType("vnd.android-dir/mms-sms");
startActivity(i);
شما می توانید پیام خود را همزمان به چندین نفر ارسال کنید.
اگر شما از روش بالا برای ارsms استفاده می کنید نیاز ندارید تا perpision را در فایل AndroidManifest.xml تعریف کنید |
دریافت پیام
در کنار ارسال پیام شما می توانید توسط شیBroadcastReceiver پیام نیز دریافت کنید
زمانی کاربرد دارد که شما می خواهید زمانی که پیام خاصی دریافت شد برنامه عمل خاصی انجام دهید.
به عنوان مثال می تواندی برنامه بنویسید زمانی که گوشی شما دزدیده شده پس از دریافت پیام با فرمتی خاص اطلاعت مکان برای شما ارسال شود.
نحوه ای دریافت با هم می بینیم.
1: در قسمت AndroidManifest.xml برنامه قبل موارد دستورات زیر را وارد کنید.
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.mehrdadjavidi.SMS"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk android:minSdkVersion="10" />
<uses-permission android:name="android.permission.SEND_SMS"/>
<uses-permission android:name="android.permission.RECEIVE_SMS"/>
<application
android:icon="@drawable/ic_launcher"
android:label="@string/app_name" >
<activity
android:label="@string/app_name"
android:name=".SMSActivity" >
<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>
</manifest>
کلاس جدید به نام SMSReceiver ایجاد کنید
دستورات زیر را درآن بنویسید.
package com.mehrdadjavidi.SMS;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.telephony.SmsMessage;
import android.util.Log;
import android.widget.Toast;
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 str = "SMS from ";
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]);
if (i==0) {
//---get the sender address/phone number---
str += msgs[i].getOriginatingAddress();
str += ": ";
}
//---get the message body---
str += msgs[i].getMessageBody().toString();
}
//---display the new SMS message---
Toast.makeText(context, str, Toast.LENGTH_SHORT).show();
Log.d("SMSReceiver", str);
}
}
}
برنامه را اجرا کنید
باDDMs یک پیام به شبیه ساز ارسال کنید برنامه شما قادر است آن را توسط Toast کلاس نمایش دهد
جلوگیری از دریافت پیام
در اینجا شاید متوجه این شده باشید که هر پیامیی که دریافت می شود هم توسط برنامه شما و هم توسط خود اندروید دریافت شود. و این به بدلیل این است پس از دریافت پیام برنامه ها می خواهند اندروید را مدیریت کنند شاید این چیزی است که شما نخواهید.
برای جلوگیری از دریافت پیام ها توسط اندروید فقط کافی است برنامه خود مانندزیر اولویت بدهید
<receiver android:name=".SMSReceiver">
<intent-filter android:priority="100">
<action android:name="android.provider.Telephony.SMS_RECEIVED" />
</intent-filter>
</receiver>
هرچه عددی که برنامه اختصای می دهدی بزرگتر باشد برنامه شما زود تر اجرا می شود. برای اینکه دیگر برنامه ها نتوانند برنامه را دریافت کنند شما به سادگی می توانید متد abortBroadcast() از کلاس BroadcastReceiver فراخوانی کنید.
package com.mehrdadjavidi.SMS;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.telephony.SmsMessage;
import android.util.Log;
import android.widget.Toast;
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 str = "SMS from ";
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]);
if (i==0) {
//---get the sender address/phone number---
str += msgs[i].getOriginatingAddress();
str += ": ";
}
//---get the message body---
str += msgs[i].getMessageBody().toString();
}
//---display the new SMS message---
Toast.makeText(context, str, Toast.LENGTH_SHORT).show();
Log.d("SMSReceiver", str);
this.abortBroadcast();}
}
}
اگر این کار را کنید دیگر هیچ برنامه قادر به دریافت پیام نخواهد بود.
به روز رسانی یک activity توسط BroadcastReceiver
در قسمت قبل نحوه ای دریافت پیام توسط این کلاس را آموختیم. گاهی اوقات می خواهیم پیام را به فعالیت اصلی برنامه ارسال کنیم. به عنوان مثال شاید شما مایل باشید پیام را در یک Textview نمیاش دهید.
در ادامه این کار را شرح می دهیم
در پروژه فبل در فایل main.xml دستورات زیر را وارد کنید.
<?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" >
<Button
android:id="@+id/btnSendSMS"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="Send SMS"
android:onClick="onClick" />
<TextView
android:id="@+id/textView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</LinearLayout>
کد های زیر را درفایل SMSReceiver.javaوارد کنید
package com.mehrdadjavidi.SMS;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.telephony.SmsMessage;
import android.util.Log;
import android.widget.Toast;
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 str = "SMS from ";
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]);
if (i==0) {
//---get the sender address/phone number---
str += msgs[i].getOriginatingAddress();
str += ": ";
}
//---get the message body---
str += msgs[i].getMessageBody().toString();
}
//---display the new SMS message---
Toast.makeText(context, str, Toast.LENGTH_SHORT).show();
Log.d("SMSReceiver", str);
//---send a broadcast intent to update the SMS received in the activity---
Intent broadcastIntent = new Intent();
broadcastIntent.setAction("SMS_RECEIVED_ACTION");
broadcastIntent.putExtra("sms", str);
context.sendBroadcast(broadcastIntent);
}
}
}
کد های زیر را در SMSActivity.java وارد نمایید.
package com.mehrdadjavidi.SMS;
import android.app.Activity;
import android.app.PendingIntent;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.Bundle;
import android.telephony.SmsManager;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.Toast;
import android.widget.TextView;
public class SMSActivity extends Activity {
String SENT = "SMS_SENT";
String DELIVERED = "SMS_DELIVERED";
PendingIntent sentPI, deliveredPI;
BroadcastReceiver smsSentReceiver, smsDeliveredReceiver;
IntentFilter intentFilter;
private BroadcastReceiver intentReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
//---display the SMS received in the TextView---
TextView SMSes = (TextView) findViewById(R.id.textView1);
SMSes.setText(intent.getExtras().getString("sms"));
}
};
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Button btnsen=(Button)findViewById(R.id.btnSendSMS);
btnsen.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
// TODO Auto-generated method stub
sendSMS("5556", "Helo My Friend");
}
});
sentPI = PendingIntent.getBroadcast(this, 0,
new Intent(SENT), 0);
deliveredPI = PendingIntent.getBroadcast(this, 0,
new Intent(DELIVERED), 0);
intentFilter = new IntentFilter();
intentFilter.addAction("SMS_RECEIVED_ACTION");
}
@Override
public void onResume() {
super.onResume();
registerReceiver(intentReceiver, intentFilter);
//---create the BroadcastReceiver when the SMS is sent---
smsSentReceiver = 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;
}
}
};
//---create the BroadcastReceiver when the SMS is delivered---
smsDeliveredReceiver = 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;
}
}
};
//---register the two BroadcastReceivers---
registerReceiver(smsDeliveredReceiver, new IntentFilter(DELIVERED));
registerReceiver(smsSentReceiver, new IntentFilter(SENT));
}
@Override
public void onPause() {
super.onPause();
//---unregister the two BroadcastReceivers---
unregisterReceiver(intentReceiver);
unregisterReceiver(smsSentReceiver);
unregisterReceiver(smsDeliveredReceiver);
}
//---sends an SMS message to another device---
private void sendSMS(String phoneNumber, String message)
{
SmsManager sms = SmsManager.getDefault();
sms.sendTextMessage(phoneNumber, null, message, sentPI, deliveredPI);
}
}
برنامه را اجرا کنید و با DDms یک پیام به شبیه ساز ارسال کنید
در ابتدا شما یک TextView را برای نمایش پیام دریافت شده به برنامه خود اضافه کردید.
بعد کلاس SMSReceiver برای دریافت sms تغیر دادید. سپس آن یک شی intent را ایجاد کردید که هرجای برنامه که به این شی گوش دادید میتواند اگاه شود که پیامی دریافت شده یا خیر .(شما آنرا در activity بعدی به کار می برید) همچنین sms دریافت شده به خارج از این intent قابل استفاده است.
Intent broadcastIntent = new Intent();
broadcastIntent.setAction("SMS_RECEIVED_ACTION");
broadcastIntent.putExtra("sms", str);
context.sendBroadcast(broadcastIntent);
سپس شما در activity خود یک شیBroadcastReceiver ایجاد کردید که به پیام ها ی سراسری گوش میدهد
private BroadcastReceiver intentReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
//---display the SMS received in the TextView---
TextView SMSes = (TextView) findViewById(R.id.textView1);
SMSes.setText(intent.getExtras().getString("sms"));
}
};
زمانی که یک intent سراسری آمد شما می توانید TextView را به روز رسانی کنید ومتن پیام را در آن نمایش دهید.
شما باید یک شی IntentFilter ایجاد کنید که به یک Intent خاص گوش میدهید که در اینجاSMS_RECEIVED_ACTION میباشد
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
sentPI = PendingIntent.getBroadcast(this, 0,
new Intent(SENT), 0);
deliveredPI = PendingIntent.getBroadcast(this, 0,
new Intent(DELIVERED), 0);
//---intent to filter for SMS messages received---
intentFilter = new IntentFilter();
intentFilter.addAction("SMS_RECEIVED_ACTION");
}
در آخر هم شما توسط متد onResume() مربوط به activity شیBroadcastReceiver را ثبت کردید و در متد onPause() آنرا unregister کردید
@Override
protected void onResume() {
//—-register the receiver—-
registerReceiver(intentReceiver, intentFilter);
super.onResume();
}
@Override
protected void onPause() {
//—-unregister the receiver—-
unregisterReceiver(intentReceiver);
super.onPause();
}
@Override
public void onResume() {
super.onResume();
//---register the receiver---
registerReceiver(intentReceiver, intentFilter);
//---create the BroadcastReceiver when the SMS is sent---
//...
}
@Override
public void onPause() {
super.onPause();
//---unregister the receiver---
unregisterReceiver(intentReceiver);
//---unregister the two BroadcastReceivers---
//...
{
این به این معنی است که TExtView زمانی پیام را نمایش میدهد که Activyt در صفحه قابل مشاهده است. و زمانی که در پس زمینه است و آن را را مشاهده نمی کنیم TextView به متن جدید به روز رسانی نمی شود.
فراخوانی یک Activity با شی BroadcastReceiver
در قسمت قبل یاد گرفتید که چگوه می تواند یک پیام دریافت شده را به یک Activityارسال کرد تان آن را نمایش دهد. در بسیاری از موارد ممکن است activity در background باشد و پیامی را دریافت کنیم در این موارد بسیار مفید بود اگر میتوانستیم یک activity را در foreGroundبرای نمیایش پیام اجرا کنیم. در زیر آن را شرح میدهیم.
به برنامه قبل بروید وفایل SMSActivity.javaآن را به صوزت زیر تغییر دهید
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
sentPI = PendingIntent.getBroadcast(this, 0,
new Intent(SENT), 0);
deliveredPI = PendingIntent.getBroadcast(this, 0,
new Intent(DELIVERED), 0);
//---intent to filter for SMS messages received---
intentFilter = new IntentFilter();
intentFilter.addAction("SMS_RECEIVED_ACTION");
//---register the receiver---
registerReceiver(intentReceiver, intentFilter);
}
@Override
public void onResume() {
super.onResume();
//---register the receiver---
//registerReceiver(intentReceiver, intentFilter);
//---create the BroadcastReceiver when the SMS is sent---
smsSentReceiver = 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;
}
}
};
//---create the BroadcastReceiver when the SMS is delivered---
smsDeliveredReceiver = 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;
}
}
};
//---register the two BroadcastReceivers---
registerReceiver(smsDeliveredReceiver, new IntentFilter(DELIVERED));
registerReceiver(smsSentReceiver, new IntentFilter(SENT));
}
@Override
public void onPause() {
super.onPause();
//---unregister the receiver---
//unregisterReceiver(intentReceiver);
//---unregister the two BroadcastReceivers---
unregisterReceiver(smsSentReceiver);
unregisterReceiver(smsDeliveredReceiver);
}
@Override
protected void onDestroy() {
super.onDestroy();
//---unregister the receiver---
unregisterReceiver(intentReceiver);
}
سپس فایل SMSReceiver.java به صورت زیر تغییر دهید
@Override
public void onReceive(Context context, Intent intent)
{
//---get the SMS message passed in---
Bundle bundle = intent.getExtras();
SmsMessage[] msgs = null;
String str = "SMS from ";
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]);
if (i==0) {
//---get the sender address/phone number---
str += msgs[i].getOriginatingAddress();
str += ": ";
}
//---get the message body---
str += msgs[i].getMessageBody().toString();
}
//---display the new SMS message---
Toast.makeText(context, str, Toast.LENGTH_SHORT).show();
Log.d("SMSReceiver", str);
//---launch the SMSActivity---
Intent mainActivityIntent = new Intent(context, SMSActivity.class);
mainActivityIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(mainActivityIntent);
//---send a broadcast intent to update the SMS received in the activity---
Intent broadcastIntent = new Intent();
broadcastIntent.setAction("SMS_RECEIVED_ACTION");
broadcastIntent.putExtra("sms", str);
context.sendBroadcast(broadcastIntent);
}
و فایلAndroidManifest.xml به صورت تغییر دهید
<activity
android:name=".SMSActivity"
android:label="@string/app_name"
android:launchMode="singleTask" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
برنامه را اجرا کنید SMSActivity نمیاش داده می شود دکمه Home را فشار دهید activity به background می رود
باDDMS یک پیام ارسال کنید توجه کنید که activity از backGround به ForeGround می آید و پیام نمایش دتاده می شود.
توضیحات
در کلاسSMSActivity شما در متدonCreate() BroadcastReceiver را registered ثبت کردید . به جای در متد onResume() و به جای unregistering در متد onPause() شما در متد onDestroy() این کار را انجام دادید. این کار شما را مطمئن می سازید زمانی که avtivity به backgground می روید هنوز هم می تواند به broadcast سراسری گوش دهد
سپس شما رویداد onReceive() را در SMSReceiverتغییر دادید
Intent mainActivityIntent = new Intent(context, SMSActivity.class);
mainActivityIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(mainActivityIntent);
//---send a broadcast intent to update the SMS received in the activity---
Intent broadcastIntent = new Intent();
broadcastIntent.setAction("SMS_RECEIVED_ACTION");
broadcastIntent.putExtra("sms", str);
context.sendBroadcast(broadcastIntent);
که startcActivity تعیین می کنید که actvityکه در پس زمینه می باشد را اجرا می کنید نکته این می باشد که شما نیاز دارید فلگ Intent.FLAG_ACTIVITY_NEW_TASK را تنظیم کنید زیر ا فراخوانی startActivity() در خارج از context یک activity نیاز به فلگ FLAG_ACTIVITY_NEW_TASKدارد
همچنین شما نیار داربد صفتlaunchMode در عنصر<activity> در فایل AndroidManifest به singleTask: تنظیم کنید
<activity android:name=".SMSActivity"
android:label="@string/app_name"
android:launchMode="singleTask" >
اگر این کار را انجام ندهید شما چندیین نمونه از یک activityبرای دریافت پیام اجرا می شوند.
نکته مهم دیگر اینجا است که زمانی که Activity به background می رود (زمانی که Hom Button و. را فشار می دهیم ) activity میتواند پیام دریافت و و TextView را به روز رسانی کند. ولی وقتی که activyt به طور کامل از بین رفت (Killed بسته شد) مثلا زمانی که دکمه back را می زنیم و activyt نابود شد activy می تواند دوباره اجرا شود ولی TextView را به روز رسانی نمی کند.
ارسال ایمیل
همانند SMS اندروید از ایمیل هم پشتیبانی می کند برنامه های Gmail/Email در اندروید شما را قادر می سازد با POP3 or IMAP. ایمیل خود را تنظیمی کنید در کنا برنامه های Gmail/Email دریاف و راسال ایمیل شما میتوانید ایمیل را از طریق بر نامه نویسی ارسال کنید که در ادامه آن را شرح میدهیم.
پروژه جدید به نامEmails. ایجاد کنید
فایلmain.xml به صورت زیر تغییر دهید
<?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" >
<Button
android:id="@+id/btnSendEmail"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:onClick="onClick"
android:text="Send Email" />
</LinearLayout>
فایلEmailsActivity به صورت زیر تغییر دهید
package com.MehrdadJavidi.Emails;
import android.app.Activity;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.view.View;
public class EmailsActivity extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
}
public void onClick(View v) {
// ---replace the following email addresses with real ones---
String[] to = { "someguy@example.com", "anotherguy@example.com" };
String[] cc = { "busybody@example.com" };
sendEmail(to, cc, "Hello", "Hello my friends!");
}
// ---sends an SMS message to another device---
private void sendEmail(String[] emailAddresses, String[] carbonCopies,
String subject, String message) {
Intent emailIntent = new Intent(Intent.ACTION_SEND);
emailIntent.setData(Uri.parse("mailto:"));
String[] to = emailAddresses;
String[] cc = carbonCopies;
emailIntent.putExtra(Intent.EXTRA_EMAIL, to);
emailIntent.putExtra(Intent.EXTRA_CC, cc);
emailIntent.putExtra(Intent.EXTRA_SUBJECT, subject);
emailIntent.putExtra(Intent.EXTRA_TEXT, message);
emailIntent.setType("message/rfc822");
startActivity(Intent.createChooser(emailIntent, "Email"));
}
}
برنامه را با F11 لجزرا کنید بر روی دکه Send Email کلیک کنید(قبل از آنم مطئن شوید که تنظیمات email را در دستگاه اندروید انجام داده اید.)
توضیحات
در اینجا شما برنامه ایمیل خود اندروید را استفاده کرده و از طریق آن ایمیل را ارسال کردید برای این کا شما می توانید از شیIntent استفاده کنید که شما م یتواندی انواع پارامتر ها از طرق متد های setData(), putExtra(),setType() تنظیم کنید
Intent emailIntent = new Intent(Intent.ACTION_SEND);
emailIntent.setData(Uri.parse("mailto:"));
String[] to = emailAddresses;
String[] cc = carbonCopies;
emailIntent.putExtra(Intent.EXTRA_EMAIL, to);
emailIntent.putExtra(Intent.EXTRA_CC, cc);
emailIntent.putExtra(Intent.EXTRA_SUBJECT, subject);
emailIntent.putExtra(Intent.EXTRA_TEXT, message);
emailIntent.setType("message/rfc822");
startActivity(Intent.createChooser(emailIntent, "Email"));
حمزه
واقعا معرکه بود. خدا خیرتون بده. لذت بردم از اموزشهای زیباتون
اسماعیلشیدایی
با عرض سلام
سلامت باشید، خوشحال هستیم که توانستیم کاری انجام بدهیم
موفق باشید
Free line
شما حرف نداری واقعا اون فایل پی دی اف که اماده کرده بودین با اقای رامشت خیلی بهم کمک کرد, فقط میتونم بگم خدا هرچی میخوای بهت بده.انشاالله
اسماعیلشیدایی
با عرض سلام
ممنون از لطف شما. بنده نیز برای شما آرزوی موفقیت داریم
ialp
سلام دوست عزیز غرض از مزاحمت درباره پیام های اندروید سوال داشتم... زیر اموزشتون خواستم سوالمو بگم که نشد مجبور شدم ایمیل بدم که بازم نرسید دیگه اومدم اینجا..به بزرگی خودتون ببخشید... شما گفتین برای گرفتن بازخورد پیام باید از pendingintent استفاده کنیم این روش وقتی چند پیام باهم بفرستیم و بخوای بفهمی کدوم پیام تحویل داده شده و کدوم نداده جوابگو نیست چکار باید کنیم ؟ ایا باید واسه هر پیا یه pendingintent اختصاصی بسازیم و چطور باید بسازیم؟ ممنون از راهنماییتون اگه به ایمیلم جواب بدین ممنون میشم
ialp
سلام شما گفتین برای گرفتن بازخورد پیام باید از pendingintent استفاده کنیم این روش وقتی چند پیام باهم بفرستیم و بخوای بفهمی کدوم پیام تحویل داده شده و کدوم نداده جوابگو نیست چیکار باید کنیم ؟ ایا باید واسه هر پیام یه pendingintent اختصاصی بسازیم و چطور باید واسه هر کدوم یه PENDINGINTENT بسازیم بسازیم؟از FLAG استفاده کردم همیشه عدد ۱۶رو برمیگردونه و نمیشه تغییرش داد!!!بهش REQUESTCODE اختصاصی دادم ولی نتونسنم اون requestcode رو از pendingintent بگیرم ...ممنون از راهنماییتون
مهردادجاویدی
برای هر پیام یک pendingintent ایجاد میشود. به عنوان مثال اگه10شماره داریم که در ارایه ذخیره شده باشه. ارایه رو با حلقه پیمایش میکنیم. برای هرشماره یک شیpendingintent ایجاد میکنیم. توضیحات تو مثال شرح دادم که می توانید مثال را دانلود و از آن استفاده کنید.
ialp
سلام ممنون از جوابتون. درسته ولی وقتی من بخوام به یک شماره مثلا چندتا پیام بفرستم و اون شماره تو دسترس نباشه و همه پیام ها معلق باشن تا وقتی که اون شماره بیاد تو دسترس...حالا اینجا من یه دکمه ارسال دارم و و هر بار با وارد کردن متن پیام, پیام رو ارسال میکنم.و نمیتونم از یه حلقه و ارایه استفاده کنم.درصورت جواب دادن.. اگه امکان داره کدش رو قرار بدین... ممنون از شما...
مهردادجاویدی
با سلام
در برنامه زیر یک مثال کامل طراحی و پیاده سازی شده است لطفا دانلود و آن را بررسی کنید. در صورتی که باز مشکل داشتید همین جا مطرح کنید.
دانلود برنامه ی ارسال پیامک در اندروید
ialp
سلام دوباره ممنون از پبگیری شما این سورس هم مشکل رو حل نمیکنه منم قبلا با دادن ایدی (putExtra)به intent که داخله pending intent هست سعی کردم که بفهمم کدوم پیام تحویل داده میشه ولی متاسفانه اون اینتنت فقط اخرین ایدی که دادمو برمیگردونه و راه حل مناسبی نیست...و تنها راه حلش ظاهرا ساختن اینتنت معلق یا pendingintent برای هر پیام بطور جداگانه ست...که این رو هم نمیشه با ارایه انجام داد...
ialp
سلام Ppendingintent باید داخل کلید ارسال پیام ساخته بشه..و با دادن ایدی به هر intent مربوط به pendingintent , برای هر پیام pendingintent اختصاصی قرار داد...درضمن ایدی رو میتونید با گرفتن اخرین ایدی داخل دیتابیس که همون primarykey هست ,تعیین کنید...
موفق باشین...
جعفر
ممنونم از اموزش کامل
فقط یه سوال: در دریافت sms چجوری تاریخ دریافتی sms را بگیرم؟؟
مدیروب سایت
با عرض سلام
از قطعه کد زیر استفاده بفرمایید:
شهاب
سلام خیلی ممنون برای اموزش و زحمات شما
لطفا بک گراند صفحه را مشکی کنین یا تیره تر کنید چون واقعا چشم اذیت میشود.