10.發(fā)送短信

10.1 問題

應用程序需要向外發(fā)送短信。

10.2 解決方案

(API Level 4)
使用SMSManager發(fā)送文字或數(shù)據短信。SMSManager是一個系統(tǒng)服務吭净,用來處理短信發(fā)送并把操作的狀態(tài)反饋給應用程序瘾腰。SMSManager提供了SmsManager.sendTextMessage()和SmsManager.sendMultipartTextMessage()方法來發(fā)送文字短信姨裸,并且提供了SmsManager.sendDataMessage()方法來發(fā)送數(shù)據短信括尸。這些方法都含有有用于傳遞發(fā)送操作狀態(tài)和將消息傳回請求目標的PendingIntent參數(shù)巷蚪。

10.3 實現(xiàn)機制

下面看一個簡單的示例,其發(fā)送一條短信并監(jiān)控其狀態(tài)(參見以下代碼清單)濒翻。
發(fā)送短信的Activity

public class SmsActivity extends Activity {
    //想要監(jiān)聽的設備地址 (電話號碼、短代碼等)
    private static final String RECIPIENT_ADDRESS = "<ENTER YOUR NUMBER HERE>";

    /* Custom Action Strings for Result Delivery */
    private static final String ACTION_SENT =
            "com.examples.sms.SENT";
    private static final String ACTION_DELIVERED =
            "com.examples.sms.DELIVERED";

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        Button sendButton = new Button(this);
        sendButton.setText("Hail the Mothership");
        sendButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                sendSMS("Beam us up!");
            }
        });

        setContentView(sendButton);
    }

    @Override
    protected void onResume() {
        super.onResume();
        //監(jiān)控操作的狀態(tài)
        registerReceiver(sent, new IntentFilter(ACTION_SENT));
        registerReceiver(delivered, new IntentFilter(ACTION_DELIVERED));
    }

    @Override
    protected void onPause() {
        super.onPause();
        //確保在位于后臺時接收器不會激活
        unregisterReceiver(sent);
        unregisterReceiver(delivered);
    }

    private void sendSMS(String message) {
        //Construct a PendingIntent to fire on SMS sent
        PendingIntent sIntent = PendingIntent.getBroadcast(
            this, 0, new Intent(ACTION_SENT), 0);
        //Construct a PendingIntent to fire on SMS delivery confirmation
        PendingIntent dIntent = PendingIntent.getBroadcast(
            this, 0, new Intent(ACTION_DELIVERED), 0);

         //發(fā)送短信
        SmsManager manager = SmsManager.getDefault();
        manager.sendTextMessage(RECIPIENT_ADDRESS, null, message,
                sIntent, dIntent);
    }

    /*
     * BroadcastReceiver that is registered to receive events when
     * an SMS message is sent; with the result code.
     */
    private BroadcastReceiver sent = new BroadcastReceiver(){
        @Override
        public void onReceive(Context context, Intent intent) {
            switch (getResultCode()) {
            case Activity.RESULT_OK:
                //發(fā)送成功
                break;
            case SmsManager.RESULT_ERROR_GENERIC_FAILURE:
            case SmsManager.RESULT_ERROR_NO_SERVICE:
            case SmsManager.RESULT_ERROR_NULL_PDU:
            case SmsManager.RESULT_ERROR_RADIO_OFF:
                //發(fā)送失敗
                break;
            }
        }
    };

    /*
     * BroadcastReceiver that is registered to receive events when
     * an SMS delivery confirmation is received; with the result code.
     */
    private BroadcastReceiver delivered = new BroadcastReceiver(){
        @Override
        public void onReceive(Context context, Intent intent) {
            switch (getResultCode()) {
            case Activity.RESULT_OK:
                //傳遞成功
                break;
            case Activity.RESULT_CANCELED:
                //傳遞失敗
                break;
            }
        }
    };
}

要點:
發(fā)送短信需要在清單中聲明android.permission.SEND_SMS權限啦膜。

在本例中有送,當用戶單擊按鈕時就會通過SMSManager發(fā)送一條短信。由于SMSManager是一項系統(tǒng)服務僧家,必須調用靜態(tài)方法SMSManager.getDefault()獲得它的一個引用雀摘。sendTextMessage()方法的參數(shù)為目標地址(號碼)、服務中心地址以及短信內容八拱。要想讓SMSManager使用系統(tǒng)默認的服務中心地址阵赠,這個參數(shù)就應該設為null涯塔。
這里注冊了兩個BroadcastReceiver,用來接收要發(fā)出的回調Intent:一個發(fā)送操作的狀態(tài)清蚀,另一個是傳遞的狀態(tài)匕荸。這些接收器只有在操作處于待發(fā)送狀態(tài)時才會被注冊,在處理完Intent后就會立即取消注冊枷邪。

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末榛搔,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子东揣,更是在濱河造成了極大的恐慌践惑,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,607評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件嘶卧,死亡現(xiàn)場離奇詭異尔觉,居然都是意外死亡,警方通過查閱死者的電腦和手機芥吟,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,239評論 3 395
  • 文/潘曉璐 我一進店門侦铜,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人运沦,你說我怎么就攤上這事泵额。” “怎么了携添?”我有些...
    開封第一講書人閱讀 164,960評論 0 355
  • 文/不壞的土叔 我叫張陵嫁盲,是天一觀的道長。 經常有香客問我烈掠,道長羞秤,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,750評論 1 294
  • 正文 為了忘掉前任左敌,我火速辦了婚禮瘾蛋,結果婚禮上,老公的妹妹穿的比我還像新娘矫限。我一直安慰自己哺哼,他們只是感情好,可當我...
    茶點故事閱讀 67,764評論 6 392
  • 文/花漫 我一把揭開白布叼风。 她就那樣靜靜地躺著取董,像睡著了一般。 火紅的嫁衣襯著肌膚如雪无宿。 梳的紋絲不亂的頭發(fā)上茵汰,一...
    開封第一講書人閱讀 51,604評論 1 305
  • 那天,我揣著相機與錄音孽鸡,去河邊找鬼蹂午。 笑死栏豺,一個胖子當著我的面吹牛,可吹牛的內容都是我干的豆胸。 我是一名探鬼主播奥洼,決...
    沈念sama閱讀 40,347評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼配乱!你這毒婦竟也來了溉卓?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 39,253評論 0 276
  • 序言:老撾萬榮一對情侶失蹤搬泥,失蹤者是張志新(化名)和其女友劉穎桑寨,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體忿檩,經...
    沈念sama閱讀 45,702評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡尉尾,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,893評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了燥透。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片沙咏。...
    茶點故事閱讀 40,015評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖班套,靈堂內的尸體忽然破棺而出肢藐,到底是詐尸還是另有隱情,我是刑警寧澤吱韭,帶...
    沈念sama閱讀 35,734評論 5 346
  • 正文 年R本政府宣布吆豹,位于F島的核電站,受9級特大地震影響理盆,放射性物質發(fā)生泄漏痘煤。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,352評論 3 330
  • 文/蒙蒙 一猿规、第九天 我趴在偏房一處隱蔽的房頂上張望衷快。 院中可真熱鬧,春花似錦姨俩、人聲如沸蘸拔。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,934評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽都伪。三九已至,卻和暖如春积担,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背猬仁。 一陣腳步聲響...
    開封第一講書人閱讀 33,052評論 1 270
  • 我被黑心中介騙來泰國打工帝璧, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留先誉,地道東北人。 一個月前我還...
    沈念sama閱讀 48,216評論 3 371
  • 正文 我出身青樓的烁,卻偏偏與公主長得像褐耳,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子渴庆,可洞房花燭夜當晚...
    茶點故事閱讀 44,969評論 2 355

推薦閱讀更多精彩內容