注:本篇文章中代碼關于短信收發部分部分參考自《第一行代碼》
我們要實作的功能是,點選一個按鈕,向朋友發送短信,内容為"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處理了一下,成功完成功能。