10.发送短信

作者: Jennyni1122 | 来源:发表于2018-11-16 09:03 被阅读11次

    10.1 问题

    应用程序需要向外发送短信。

    10.2 解决方案

    (API Level 4)
    使用SMSManager发送文字或数据短信。SMSManager是一个系统服务,用来处理短信发送并把操作的状态反馈给应用程序。SMSManager提供了SmsManager.sendTextMessage()和SmsManager.sendMultipartTextMessage()方法来发送文字短信,并且提供了SmsManager.sendDataMessage()方法来发送数据短信。这些方法都含有有用于传递发送操作状态和将消息传回请求目标的PendingIntent参数。

    10.3 实现机制

    下面看一个简单的示例,其发送一条短信并监控其状态(参见以下代码清单)。
    发送短信的Activity

    public class SmsActivity extends Activity {
        //想要监听的设备地址 (电话号码、短代码等)
        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();
            //监控操作的状态
            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);
    
             //发送短信
            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:
                    //发送成功
                    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:
                    //发送失败
                    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;
                }
            }
        };
    }
    

    要点:
    发送短信需要在清单中声明android.permission.SEND_SMS权限。

    在本例中,当用户单击按钮时就会通过SMSManager发送一条短信。由于SMSManager是一项系统服务,必须调用静态方法SMSManager.getDefault()获得它的一个引用。sendTextMessage()方法的参数为目标地址(号码)、服务中心地址以及短信内容。要想让SMSManager使用系统默认的服务中心地址,这个参数就应该设为null。
    这里注册了两个BroadcastReceiver,用来接收要发出的回调Intent:一个发送操作的状态,另一个是传递的状态。这些接收器只有在操作处于待发送状态时才会被注册,在处理完Intent后就会立即取消注册。

    相关文章

      网友评论

        本文标题:10.发送短信

        本文链接:https://www.haomeiwen.com/subject/bllgwftx.html