android菜鸟进阶之路——发送短信与接收短信

        问题描述,如题写一个发送与接收短信的程序。最终界面如下:

       
首先是这个界面的布局文件,布局文件不用过多解释:
         <?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android=" http://schemas.android.com/apk/res/android"

    android:layout_width="match_parent"

    android:layout_height="match_parent"

    android:orientation="vertical" >

    <LinearLayout 

        android:layout_width="match_parent"

        android:layout_height="50dp"

        >

        <TextView 

            android:layout_width="wrap_content"

            android:layout_height="wrap_content"

            android:layout_gravity="center_vertical"

            android:padding="10dp"

            android:text="From: "

            />

        <TextView 

            android:id="@+id/sender"

            android:layout_width="wrap_content"

            android:layout_height="wrap_content"

            android:layout_gravity="center_vertical"/>

    </LinearLayout>

    <LinearLayout 

        android:layout_width="match_parent"

        android:layout_height="50dp">

         <TextView 

            android:layout_width="wrap_content"

            android:layout_height="wrap_content"

            android:layout_gravity="center_vertical"

            android:padding="10dp"

            android:text="Content: "

            />

        <TextView 

            android:id="@+id/content"

            android:layout_width="wrap_content"

            android:layout_height="wrap_content"

            android:layout_gravity="center_vertical"/>

    </LinearLayout>

    <LinearLayout 

        android:layout_width="match_parent"

        android:layout_height="50dp"

        >

        <TextView 

            android:layout_width="wrap_content"

            android:layout_height="wrap_content"

            android:layout_gravity="center_vertical"

            android:padding="10dp"

            android:text="To: "

            />

        <EditText 

            android:id="@+id/to"

            android:layout_width="0dp"

            android:layout_height="wrap_content"

            android:layout_weight="1"

            android:layout_gravity="center_vertical"/>

    </LinearLayout>

    <LinearLayout 

        android:layout_width="match_parent"

        android:layout_height="50dp">

         <EditText 

            android:id="@+id/msg_input"

            android:layout_width="0dp"

            android:layout_height="wrap_content"

            android:layout_gravity="center_vertical"

            android:layout_weight="1"

            />

        <Button 

            android:id="@+id/send"

            android:layout_width="wrap_content"

            android:layout_height="wrap_content"

            android:layout_gravity="center_vertical"

            android:text="Send"/>

    </LinearLayout>

</LinearLayout>
        因为是接收和发送短信的应用,所以需要在配置文件中添加相应的权限,如下:
            <uses-permission android:name="android.permission.RECEIVE_SMS"/>
            <uses-permission android:name="android.permission.SEND_SMS"/>
下面就是具体的程序,我会在代码中给出相应的注释(包名引入忽略,如需代码可以ctrl+shift+o进行导入包):
            public class ThirdActivity extends Activity{
                 private TextView sender;
                 private TextView content;
                 private IntentFilter receiveFilter;                                          // 知识点1                                
                 private MessageReceiver messageReceiver;                       //   实例化 广播接收器,在下面创建
                 private EditText to;
                 private EditText msgInput;
                 private Button send;
                 private IntentFilter sendFilter;
                 private SendStatusReceiver sendStatusReceiver;         // 另外建一个 广播接收器 SendStatusReceiver,监听 短信发送状态
 
         @Override
         protected void onCreate(Bundle savedInstanceState) {
                  // TODO Auto-generated method stub
                  super.onCreate(savedInstanceState);
                  setContentView(R.layout.activity_main);
                  sender = (TextView) findViewById(R.id.sender);
                  content = (TextView) findViewById(R.id.content);
                   receiveFilter = new IntentFilter();                                                      // 动态注册过滤器,知识点2.
                    receiveFilter.addAction("android.provider.Telephony.SMS_RECEIVED");
                 //  有序广播的传递是可以截断的, 而系统发出的短信广播正是一条有序广播,设置优先权,先于系统接收,然后        在onReceive()方法中调用 abortBroadcast()方法,中止掉广播的继续传递。
                   receiveFilter.setPriority(100);           
                  messageReceiver = new MessageReceiver();
                  registerReceiver(messageReceiver, receiveFilter);                                        //   动态对MessageReceiver 的实例进行注册,才能让它接收到短信广播,注意所需参数。在 onCreate()方 法中对 MessageReceiver 进行注册,在 onDestroy()方法中再对它取消注册。
 
                  to = (EditText) findViewById(R.id.to);
                  msgInput = (EditText) findViewById(R.id.msg_input);
                  sendFilter = new IntentFilter();
                  sendFilter.addAction("SENT_SMS_ACTION");
                  sendStatusReceiver = new SendStatusReceiver();
                  registerReceiver(sendStatusReceiver, sendFilter);                   // 注册了一个新的广播接收器 SendStatusReceiver,这个广播接收器就是专门用于监听 短信发送状态.
                  send = (Button) findViewById(R.id.send);
                  send.setOnClickListener(new OnClickListener() {
                                   // 当 Send 按钮被点击时,会先调用 SmsManager 的 getDefault()方法获取到 SmsManager 的实例,然后再调用它的 sendTextMessage()方法就可以去发送短信了。sendTextMessage()方法接收五个参数。
                                   @Override
                                     public void onClick(View v) {
                                            // TODO Auto-generated method stub
                                            SmsManager smsManager = SmsManager.getDefault();
                                            Intent sentIntent = new Intent("SENT_SMS_ACTION");
                                            PendingIntent pi = PendingIntent.getBroadcast(ThirdActivity.this, 0, sentIntent, 0);
                                            // 发送短信的方法,注意参数。
                                            smsManager.sendTextMessage(to.getText().toString(), null, msgInput.getText().toString(), pi, null);
                                      }
                  });                                   
         }
 
         @Override
         protected void onDestroy() {
                  // TODO Auto-generated method stub
                  super.onDestroy();
                  unregisterReceiver(messageReceiver);                                         // 取消接收信息广播的注册。
                  unregisterReceiver(sendStatusReceiver);
         }
 
         class MessageReceiver extends BroadcastReceiver{                             // 创建一个广播接收器来接收系统发出的短信广播

                        /* 首先我们从 Intent 参数中取出了一个 Bundle对象,然后使用 pdu 密钥来提取
                        一个 SMS pdus 数组,其中每一个 pdu 都表示一条短信消息。接着使用 SmsMessage 的
                        createFromPdu()方法将每一个 pdu 字节数组转换为 SmsMessage 对象,调用这个对象的
                        getOriginatingAddress()方法就可以获取到短信的发送方号码,调用 getMessageBody()方法就
                        可以获取到短信的内容,然后将每一个 SmsMessage 对象中的短信内容拼接起来,就组成了
                        一条完整的短信。最后将获取到的发送方号码和短信内容显示在 TextView上.
                        */
                  @Override
                  public void onReceive(Context context, Intent intent) {
                           // TODO Auto-generated method stub
                           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();         //获取短信内容
                           }
                           sender.setText(address);
                           content.setText(fullMessage);
                           abortBroadcast();                                                               // 中止 掉广播的继续传递
                  }
           }
 
         class SendStatusReceiver extends BroadcastReceiver{

                  @Override
                  public void onReceive(Context context, Intent intent) {
                           // TODO Auto-generated method stub
                           if(getResultCode()==RESULT_OK){                                 // getResultCode()的值等于 RESULT_OK就会提示发送成功
                                    //短信发送成功
                                    Toast.makeText(context, "Send succeeded", Toast.LENGTH_LONG).show();
                           }else{
                                    //短信发送失败
                                    Toast.makeText(context, "Send failed", Toast.LENGTH_LONG).show();
                           }
                    }    
           }
}
        学到的知识点:
                知识点1: IntentFilter类表示Intent过滤器, 一般来说,,IntentFilter应该在 Android Manifest.xml文件中定义。 intent最多只能定义1个action, 而filter可以定义1个或多个action。 如果filter没有定义action, 则这个filter将阻塞所有intent。如果intent没有定义action, 那么只要filter定义了action就可以通过action测试。本程序是动态注册。
                知识点2:动态注册广播接收器和过滤器,淡紫色的四行代码。
                知识点3:发送短信的具体代码,以及各个参数,onReceive()方法中具体有体现。
        到这里,一个接收发送短信的应用就创建完成了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值