在Android中常見的發送短信的方式有以下兩種:
1.利用系統的短信發送程序發送短信
這裏面又可以分爲兩種寫法:
1.1 利用Intent發送一個隱式意圖
Intent intent = new Intent(Intent.ACTION_SENDTO); Uri data = Uri.parse("smsto:"+ "15555215556"); intent.setData(data); intent.putExtra("sms_body", etContent.getText().toString()); startActivity(intent);
1.2 另外一種隱式意圖
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setType("vnd.android-dir/mms-sms");
intent.putExtra("address", "15555215556");
intent.putExtra("sms_body", etContent.getText().toString());
startActivity(intent);
2.利用代碼來發送短消息
2.1 簡單一些的寫法 SmsManager manager = SmsManager.getDefault(); manager.sendTextMessage(對方手機號碼,null,短信正文,null,null); 2.2 添加上兩個PendingIntent,可以獲得短信的發送狀態。
MainActivity完整代碼如下:
package xxxx.Messagedemo; 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.telephony.SmsMessage; import android.util.Log; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.EditText; public class MainActivity extends Activity { EditText etContent; Button btnSend; MyReceiver receiver; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); etContent=(EditText) findViewById(R.id.etContent); btnSend=(Button) findViewById(R.id.btnSend); btnSend.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { sendSMS(); } }); } /* public void onClick(View v){ sendSMS(); }*/ @Override protected void onResume() { super.onResume(); receiver=new MyReceiver(); IntentFilter filter=new IntentFilter(); filter.addAction("terena.SENT"); filter.addAction("tarena.DELIVERY"); filter.addAction("android.provider.Telephony.SMS_RECEIVED"); filter.setPriority(1001); registerReceiver(receiver, filter); } @Override protected void onPause() { unregisterReceiver(receiver); super.onPause(); } private void sendSMS() { //1.發送隱式意圖發送短信 /*Intent intent=new Intent(Intent.ACTION_SENDTO); Uri data=Uri.parse("smsto:"+15555215556); intent.setData(data); intent.putExtra("sms_body", etContent.getText().toString()); startActivity(intent);*/ /*Intent intent=new Intent(Intent.ACTION_VIEW); intent.setType("vnd.android-dir/mms-sms"); intent.putExtra("address", "15555215556"); intent.putExtra("sms_body", etContent.getText().toString()); startActivity(intent);*/ //2.利用代碼發送短信 SmsManager manager=SmsManager.getDefault(); Intent intent=new Intent("terena.SENT"); PendingIntent pi1=PendingIntent.getBroadcast(this, 0, intent, 0); Intent intent2=new Intent("tarena.DELIVERY"); PendingIntent pi2=PendingIntent.getBroadcast(this, 0, intent2, 0); manager.sendTextMessage("15555215556", null, etContent.getText().toString(), pi1, pi2); } public class MyReceiver extends BroadcastReceiver{ @Override public void onReceive(Context context, Intent intent) { String action=intent.getAction(); if("terena.SENT".equals(action)){ Log.d("TAG", "發送成功"+System.currentTimeMillis()); } if("tarena.DELIVERY".equals(action)){ Log.d("TAG", "對方已收到短信"+System.currentTimeMillis()); } if("android.provider.Telephony.SMS_RECEIVED".equals(action)){ //處理短信 Bundle bundle=intent.getExtras(); Object[] pdus=(Object[]) bundle.get("pdus"); StringBuffer sb=new StringBuffer(); String number=""; //把一個個pdus轉爲一段段的短消息 for(int i=0;i<pdus.length;i++){ SmsMessage message=SmsMessage.createFromPdu((byte[])pdus[i]); sb.append(message.getDisplayMessageBody()); number=message.getDisplayOriginatingAddress(); } Log.d("TAG", "發送方電話:"+number+",發送的內容是:"+sb.toString()); //"有短息"這條廣播不再繼續下發 abortBroadcast(); } } } }
利用代碼發送短信,有兩點問題要注意:
1)申請權限 SEND_SMS
2) 利用代碼發送短信,短信是不會被系統寫入數據表
短信的接收
安卓系統後臺有一個服務(Service),專門用來接收短消息。當有新的消息達到時,Service會發送一個廣播,廣播的Action是“android.provider.Telephony.SMS_RECEIVED”並且將收到短消息作爲廣播Intent的一部分(Intent的Extra)發送出去。先到先得!
自己編寫的程序如果想收到短信息,需要注意以下幾點: 1)註冊廣播接收器,接收android.provider.Telephony.SMS_RECEIVED廣播 2)必須設定權限 RECEIVE_SMS 3) 設定較高的優先級 (1000左右) 4)如果不希望系統的短信程序接收短信,就執行abortBroadcast,廣播停止下發 同時也會有一個問題:如果系統短信接收程序收不到短信了,那麼這條短信也不會被寫入數據庫,在本地是查詢不到記錄的,不利於我們日後查詢相關信息,切記,小心使用。