Android中發送短信的幾種常見寫法及注意事項

在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,廣播停止下發
同時也會有一個問題:如果系統短信接收程序收不到短信了,那麼這條短信也不會被寫入數據庫,在本地是查詢不到記錄的,不利於我們日後查詢相關信息,切記,小心使用。



發佈了25 篇原創文章 · 獲贊 24 · 訪問量 8萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章