پیام ها (اس ام اس) در اندروید (Messaging)

پیام ها (اس ام اس) در اندروید (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دراندروید

توضیحات برنامه:

در ابتدا برای اینکه بتوانیم از امکانات ارسال 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"));

نظرات

  • Hannah Martinez
    حمزه
    دو شنبه 11 دی 1278 - 0:00

    واقعا معرکه بود. خدا خیرتون بده. لذت بردم از اموزشهای زیباتون

    • Judith Bell
      پاسخ
      اسماعیلشیدایی
      دو شنبه 11 دی 1278 - 0:00

      با عرض سلام

      سلامت باشید، خوشحال هستیم که توانستیم کاری انجام بدهیم

      موفق باشید

  • Hannah Martinez
    Free line
    دو شنبه 11 دی 1278 - 0:00

    شما حرف نداری واقعا اون فایل پی دی اف که اماده کرده بودین با اقای رامشت خیلی بهم کمک کرد, فقط میتونم بگم خدا هرچی میخوای بهت بده.انشاالله 

    • Judith Bell
      پاسخ
      اسماعیلشیدایی
      دو شنبه 11 دی 1278 - 0:00

      با عرض سلام
      ممنون از لطف شما. بنده نیز برای شما آرزوی موفقیت داریم

  • Hannah Martinez
    ialp
    دو شنبه 11 دی 1278 - 0:00

    سلام دوست عزیز غرض از مزاحمت درباره پیام های اندروید سوال داشتم... زیر اموزشتون خواستم سوالمو بگم که نشد مجبور شدم ایمیل بدم که بازم نرسید دیگه اومدم اینجا..به بزرگی خودتون ببخشید... شما گفتین برای گرفتن بازخورد پیام باید از pendingintent استفاده کنیم این روش وقتی چند پیام باهم بفرستیم و بخوای بفهمی کدوم پیام تحویل داده شده و کدوم نداده جوابگو نیست چکار باید کنیم ؟ ایا باید واسه هر پیا یه pendingintent اختصاصی بسازیم و چطور باید بسازیم؟ ممنون از راهنماییتون اگه به ایمیلم جواب بدین ممنون میشم

  • Hannah Martinez
    ialp
    دو شنبه 11 دی 1278 - 0:00

    سلام شما گفتین برای گرفتن بازخورد پیام باید از pendingintent استفاده کنیم این روش وقتی چند پیام باهم بفرستیم و بخوای بفهمی کدوم پیام تحویل داده شده و کدوم نداده جوابگو نیست چیکار باید کنیم ؟ ایا باید واسه هر پیام یه pendingintent اختصاصی بسازیم و چطور باید واسه هر کدوم یه PENDINGINTENT بسازیم بسازیم؟از FLAG استفاده کردم همیشه عدد ۱۶رو برمیگردونه و نمیشه تغییرش داد!!!بهش REQUESTCODE اختصاصی دادم ولی نتونسنم اون requestcode رو از pendingintent بگیرم ...ممنون از راهنماییتون

    • Judith Bell
      پاسخ
      مهردادجاویدی
      دو شنبه 11 دی 1278 - 0:00

      برای هر پیام یک pendingintent ایجاد میشود. به عنوان مثال اگه10شماره داریم که در ارایه ذخیره شده باشه. ارایه رو با حلقه پیمایش میکنیم. برای هرشماره یک شیpendingintent ایجاد میکنیم. توضیحات تو مثال شرح دادم که می توانید مثال را دانلود و از آن استفاده کنید.

  • Hannah Martinez
    ialp
    دو شنبه 11 دی 1278 - 0:00

    سلام ممنون از جوابتون. درسته ولی وقتی من بخوام به یک شماره مثلا چندتا پیام بفرستم و اون شماره تو دسترس نباشه و همه پیام ها معلق باشن تا وقتی که اون شماره بیاد تو دسترس...حالا اینجا من یه دکمه ارسال دارم و و هر بار با وارد کردن متن پیام, پیام رو ارسال می‌کنم.و نمیتونم از یه حلقه و ارایه استفاده کنم.درصورت جواب دادن.. اگه امکان داره کدش رو قرار بدین... ممنون از شما...

  • Hannah Martinez
    ialp
    دو شنبه 11 دی 1278 - 0:00

    سلام دوباره ممنون از پبگیری شما این سورس هم مشکل رو حل نمیکنه منم قبلا با دادن ایدی (putExtra)به intent که داخله pending intent هست سعی کردم که بفهمم کدوم پیام تحویل داده میشه ولی متاسفانه اون اینتنت فقط اخرین ایدی که دادمو برمیگردونه و راه حل مناسبی نیست...و تنها راه حلش ظاهرا ساختن اینتنت معلق یا pendingintent برای هر پیام بطور جداگانه ست...که این رو هم نمیشه با ارایه انجام داد...

  • Hannah Martinez
    ialp
    دو شنبه 11 دی 1278 - 0:00

    سلام Ppendingintent باید داخل کلید ارسال پیام ساخته بشه..و با دادن ایدی به هر intent مربوط به pendingintent , برای هر پیام pendingintent اختصاصی قرار داد...درضمن ایدی رو میتونید با گرفتن اخرین ایدی داخل دیتابیس که همون primarykey هست ,تعیین کنید...

     

    b_send.setOnClickListener(new OnClickListener()
       {
          public void onClick(View v)
         {
    
          sent_intent=new Intent(SENT);
          deliveryIntent=new Intent(deliverd);
          sent_intent.putExtra("id",get_msg_id());
          delivery_Intent.putExtra("id",get_msg_id());
    
         sentPendingI = PendingIntent.getBroadcast(getApplicationContext(), get_msg_id(), sent_intent, 0); deliveredPendingI =  PendingIntent.getBroadcast(getApplicationContext(),get_msg_id(), delivery_Intent, 0);
         }
      }
    
    );
    
     
    

    موفق باشین...

  • Hannah Martinez
    جعفر
    دو شنبه 11 دی 1278 - 0:00

    ممنونم از اموزش کامل

    فقط یه سوال: در دریافت sms چجوری تاریخ دریافتی sms را بگیرم؟؟

     

    • Judith Bell
      پاسخ
      مدیروب سایت
      دو شنبه 11 دی 1278 - 0:00

      با عرض سلام

      از قطعه کد زیر استفاده بفرمایید:

       



       

      
      ContentResolver contentResolver = getContentResolver();
      Cursor cursor = contentResolver.query( Uri.parse( "content://sms/inbox" ), null, null, null, null);
      cursor.moveToFirst();
      String date =  cursor.getString(cursor.getColumnIndex("date"));
      Long timestamp = Long.parseLong(date);    
      Calendar calendar = Calendar.getInstance();
      calendar.setTimeInMillis(timestamp);
      Date finaldate = calendar.getTime();
      String smsDate = finaldate.toString();
      Log.d(Home.class.getName(), smsDate);
      
      

  • Hannah Martinez
    شهاب
    چهار شنبه 24 مهر 1398 - 23:42

    سلام خیلی ممنون برای اموزش و زحمات شما

    لطفا بک گراند صفحه را مشکی کنین یا تیره تر کنید چون واقعا چشم اذیت میشود.

نظرات یا سوالات خودرا با ما درمیان بگذارید

0912 097 5516 :شماره تماس
0713 625 1757 :شماره تماس