天天看點

基于地圖的短信追蹤小練習(3)短信的接收與發送

注:本篇文章中代碼關于短信收發部分部分參考自《第一行代碼》

我們要實作的功能是,點選一個按鈕,向朋友發送短信,内容為"where are you?",朋友收到之後,發還一個經緯度資訊,這裡面的邏輯很好想,設定好要發送的資訊之後發送,接收到之後判斷,再擷取到想要的資訊,根據擷取到的發送方,發送經緯度給它。

是以關鍵還是發送和接受本身的實作邏輯。

注意,接收短信可以在模拟器中,我們可以用ddms來發送短信,但是發送短信就必須在真機中了。

我們設定點選事件,發送短信,發送短信的邏輯其實就兩行代碼

botton2 = (Button)findViewById(R.id.refresh);
	   botton2.setOnClickListener(new OnClickListener(){
		@Override
		public void onClick(View view)
		{
			SmsManager smsManager = SmsManager.getDefault();   //發送短信的邏輯
			smsManager.sendTextMessage(friends,null,"where are you?",null,null);
		}
	   });
           

注意sendTextMessage的第一個參數是手機号,第三個參數是短信内容。

我們設定接收短信的邏輯是要定義類繼承BroadcastReceiver,它能在廣播接收器裡監聽系統的廣播,當收到短信的時候會執行。

class MessageReceiver extends BroadcastReceiver
		{
			@Override
			public void onReceive(Context context, Intent intent)  //  onReceive()
			{
				Bundle bundle = intent.getExtras();
				Object[] pdus = (Object[])bundle.get("pdus");
				SmsMessage[] messages = new SmsMessage[pdus.length];
				for(int i = 0; i<messages.length; i++)
				{
					messages[i] = SmsMessage.createFromPdu((byte[])pdus[i]);
				}
				String address = messages[0].getOriginatingAddress();
				String fullMessage = " ";
				for(SmsMessage message : messages)
				{
					fullMessage += message.getMessageBody();
				}  //收取處理短信字元串   ->  address  fullmessage
				//Toast.makeText(getApplicationContext(), address, Toast.LENGTH_SHORT).show();
				//Toast.makeText(getApplicationContext(), fullMessage, Toast.LENGTH_SHORT).show();
				//Toast.makeText(getApplicationContext(),address.substring(3, address.length()), Toast.LENGTH_SHORT).show();
				//System.out.println(address);
				//System.out.println(fullMessage);
				//System.out.println(address.substring(3, address.length()-1));
				
				if(fullMessage.trim().equals("where are you?"))
				{
					//Toast.makeText(getApplicationContext(),address.substring(3, address.length()), Toast.LENGTH_SHORT).show();
					SmsManager smsManager = SmsManager.getDefault(); //address.substring(3)
					smsManager.sendTextMessage(address.substring(3, address.length()),null,String.valueOf(location.getLatitude())+"/"+String.valueOf(location.getLongitude()),null,null);
				}	
			}
		}
	   MessageReceiver messageReceiver = new MessageReceiver();
	   registerReceiver(messageReceiver, receiveFilter);
           

我們用bundle接收到短信,轉化為smsmessage對象,再進行處理,擷取到發送方号碼和短信内容(address和content)

再判斷,如果收到的是where are you?那麼就發還經緯度給發送方。

發送方有+86是以用substring處理了一下。

經緯度的擷取并轉為string:

String.valueOf(location.getLatitude())+"/"+String.valueOf(location.getLongitude()
           

遇到問題:

if(fullMessage.trim().equals("where are you?"))

不執行,但是toast出來的字元串又是相等的。

最後用system輸出,在Logcat中觀察到其實是有空格的,用trim處理了一下,成功完成功能。