android學習筆記——收發短信練習

先來學習一下收短信。
收短信用到了我們之前學過的內容--廣播機制。當手機收到一條短信時,會發送出一條值爲“android.provider.Telephony.SMS_RECEIVED”的廣播,這條廣播裏攜帶着與短信相關的所有數據。我們可以利用廣播接收器將這條廣播監聽截取到,然後對這個內容進行解析(記住還要把廣播截斷,讓系統本身收不到)。這樣就完成了一個簡單的短信接收。
1.寫一個簡單的佈局
2.寫好接收器,在onReceive()中做好短信內容的獲取以及電話信息的獲取。
3.在MainActivity中註冊以及銷燬

我們直接看2吧,在這裏要做
public class MessageReceiver extends BroadcastReceiver{
    @Override
    public void onReceive(Context context, Intent intent) {
        Bundle bundle = intent.getExtras();
        Object[] pdus = (Object[]) bundle.get("puds"); //提取短信消息
        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();//獲取短信內容
        }
        sender.setText(address);
        content.setText(fullMessage);

    }
}

從Intent中取出Bundle對象,使用puds祕鑰來提取一個SMS pdus數組,其中每一個pdu都表示一條短信消息。接着使用SmsMessage的createFromPdu()方法將每一個pdu字節數組轉換爲SmsMessage對象。調用這個對象的getOriginatingAddress()方法就可以獲取到短信的發送方號碼,調用getMessageBody()方法就獲取到短信的內容,拼起來就是完整的短信了。記得把他們放到界面的控件上去。

在MainActivity中要做的註冊活動
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    sender = (TextView) findViewById(R.id.sender);
    content = (TextView) findViewById(R.id.content);
    receiverFilter new IntentFilter();
    receiverFilter.addAction("android.provider.Telephony.SMS_RECEIVED");
    messageReceiver new MessageReceiver();
    registerReceiver(messageReceiver,receiverFilter);
}
這樣就完成了一個簡單的短信接收功能,還要記得註銷操作,如果要做到短信的攔截記得設置高接收器的優先級,加上截斷代碼abortBroadcast(),還有就是權限的問題。
收短信權限:
<uses-permission android:name="android.permission.RECEIVE_SMS"/>
要想測試一下我們可以使用DDMS下的Emulator Control切換卡,可以給虛擬機做短信測試用(環境自帶的虛擬機可用,Genymotion有些問題,沒查出來,使用環境自帶的先)


然後我們就可以考慮一下發短信了。
發短信其實是用到了SmsManager的一個sendTextMessage()這樣的方法,就這麼簡單。
還是先來說明一下要做的工作
1.寫一個佈局(每次都特別簡單就不寫了)
2.拿到SmsManager的實例,調用sendTextMessage()方法

在正式寫之前我們應該學會sendTextMessage()方法的參數
public void sendTextMessage (String destinationAddress, String scAddress, String text, PendingIntent sentIntent, PendingIntent deliveryIntent)
destinationAddress 發送短信的地址(也就是號碼)
scAddress 短信服務中心,如果爲null,就是用當前默認的短信服務中心
text 短信內容
sentIntent 如果不爲null,當短信發送成功或者失敗時,這個PendingIntent會被廣播出去成功的結果代碼是Activity.RESULT_OK,或者下面這些錯誤之一  :RESULT_ERROR_GENERIC_FAILURE
RESULT_ERROR_RADIO_OFF
RESULT_ERROR_NULL_PDU
對於 RESULT_ERROR_GENERIC_FAILURE,  the這個sentIntent可能包括額外的"errorCode",包含一些具體有用的信息幫助檢查 。基於SMS控制的全部程序檢查 sentIntent. 如果 sentIntent 爲空,the caller will be checked against all unknown applications, which cause smaller number of SMS to be sent in checking period.
deliveryIntent
如果不爲null,當這個短信發送到接收者那裏,這個PendtingIntent會被廣播,狀態報告生成的pdu(指對等層次之間傳遞的數據單位)會拓展到數據("pdu")

後兩個參數的目的相信大家已經明確了,如果要用到就當然需要接收器了,(這裏我寫了一個根據第四個參數來進行相應動作的接收器)
在MainActivity中onCreate()寫的代碼
to = (EditText) findViewById(R.id.To);
msgInput = (EditText) findViewById(R.id.msg_input);
send = (Button) findViewById(R.id.send);

sendFilter new IntentFilter();
sendFilter.addAction("SENT_SMS_ACTION");
sendStatusReceiver new SendStatusReceiver();
registerReceiver(sendStatusReceiver,sendFilter);
send.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        SmsManager smsManager = SmsManager.getDefault();
        Intent sentIntent = new Intent("SENT_SMS_ACTION");
        PendingIntent pi = PendingIntent.getBroadcast(MainActivity.this,0,sentIntent,0);
        smsManager.sendTextMessage(to.getText().toString(), nullmsgInput.getText().toString(), pi, null);
    }
});

收到廣播相應的動作如下
public class SendStatusReceiver extends BroadcastReceiver{

    @Override
    public void onReceive(Context context, Intent intent) {
        if (getResultCode() == RESULT_OK){
            Toast.makeText(context,"Send succeeded",Toast.LENGTH_LONG).show();
        }else {
            Toast.makeText(context,"Send failed",Toast.LENGTH_LONG).show();
        }
    }
}
這樣就完成了。很簡單對不對。
別忘了權限
<uses-permission android:name="android.permission.SEND_SMS" />
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章