先来学习一下收短信。


收短信用到了我们之前学过的内容--广播机制。当手机收到一条短信时,会发送出一条值为“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(); 
 
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

RESULT_ERROR_GENERIC_FAILURE

RESULT_ERROR_RADIO_OFF

RESULT_ERROR_NULL_PDU

对于 RESULT_ERROR_GENERIC_FAILURE, 

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(),  
 null,  
 msgInput.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" />