android中短信的发送与接收

android中可以通过两种方式发送短信 

第一:调用系统短信接口直接发送短信;主要代码如下: 
/**  
  1.      * 直接调用短信接口发短信 
  2.      * @param phoneNumber 
  3.      * @param message 
  4.      */  
  5. public void sendSMS(String phoneNumber,String message){  
  6.         //获取短信管理器android.telephony.SmsManager,不要导错包。
  7.         android.telephony.SmsManager smsManager = android.telephony.SmsManager.getDefault();  
  8.         //拆分短信内容(手机短信长度限制)。默认140个字符,模拟器不可以发送中文会乱码    
  9.         List<String> divideContents = smsManager.divideMessage(message);   
  10.         for (String text : divideContents) {    
  11.             smsManager.sendTextMessage(phoneNumber, null, text, sentPI, deliverPI);    
  12.         }  
  13.     }  
第二:调起系统发短信功能;主要代码如下: 
/**  
  1.      * 调起系统发短信功能 
  2.      * @param phoneNumber 
  3.      * @param message 
  4.      */  
  5.     public void doSendSMSTo(String phoneNumber,String message){  
  6.         if(PhoneNumberUtils.isGlobalPhoneNumber(phoneNumber)){  
  7.             Intent intent = new Intent(Intent.ACTION_SENDTO, Uri.parse("smsto:"+phoneNumber));            
  8.             intent.putExtra("sms_body", message);            
  9.             startActivity(intent);  
  10.         }  
  11.     }  
别忘了权限:
<uses-permission android:name="android.permission.SEND_SMS" />
这里主要讲解第一种方法,第一种方法可以监控发送状态和对方接收状态。
处理返回的发送状态:

  1. //处理返回的发送状态   
  2. String SENT_SMS_ACTION = "SENT_SMS_ACTION";  
  3. Intent sentIntent = new Intent(SENT_SMS_ACTION);  
  4. PendingIntent sentPI = PendingIntent.getBroadcast(context, 0, sentIntent,  
  5.         0);  
  6. // register the Broadcast Receivers  
  7. context.registerReceiver(new BroadcastReceiver() {  
  8.     @Override  
  9.     public void onReceive(Context _context, Intent _intent) {  
  10.         switch (getResultCode()) {  
  11.         case Activity.RESULT_OK:  
  12.             Toast.makeText(context,  
  13.         "短信发送成功", Toast.LENGTH_SHORT)  
  14.         .show();  
  15.         break;  
  16.         case SmsManager.RESULT_ERROR_GENERIC_FAILURE:  
  17.         break;  
  18.         case SmsManager.RESULT_ERROR_RADIO_OFF:  
  19.         break;  
  20.         case SmsManager.RESULT_ERROR_NULL_PDU:  
  21.         break;  
  22.         }  
  23.     }  
  24. }, new IntentFilter(SENT_SMS_ACTION));  

处理返回的接收状态 :

  1. //处理返回的接收状态   
  2. String DELIVERED_SMS_ACTION = "DELIVERED_SMS_ACTION";  
  3. // create the deilverIntent parameter  
  4. Intent deliverIntent = new Intent(DELIVERED_SMS_ACTION);  
  5. PendingIntent deliverPI = PendingIntent.getBroadcast(context, 0,  
  6.        deliverIntent, 0);  
  7. context.registerReceiver(new BroadcastReceiver() {  
  8.    @Override  
  9.    public void onReceive(Context _context, Intent _intent) {  
  10.        Toast.makeText(context,  
  11.   "收信人已经成功接收", Toast.LENGTH_SHORT)  
  12.   .show();  
  13.    }  
  14. }, new IntentFilter(DELIVERED_SMS_ACTION));  
发送短信的参数说明: 收藏代码
  1. smsManager.sendTextMessage(destinationAddress, scAddress, text, sentIntent, deliveryIntent)  

-- destinationAddress:目标电话号码 
-- scAddress:短信中心号码,测试可以不填 
-- text: 短信内容 
-- sentIntent:发送 -->中国移动 --> 中国移动发送失败 --> 返回发送成功或失败信号 --> 后续处理   即,这个意图包装了短信发送状态的信息 

-- deliveryIntent: 发送 -->中国移动 --> 中国移动发送成功 --> 返回对方是否收到这个信息 --> 后续处理  即:这个意图包装了短信是否被对方收到的状态信息(供应商已经发送成功,但是对方没有收到)。

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Android开发获取手机短信内容(监听器)

最近做的项目里要监听手机的短消息内容。

前提--权限:

 copy
  1. <uses-permission android:name="android.permission.RECEIVE_SMS" >  
  2. </uses-permission>  
  3. <uses-permission android:name="android.permission.READ_SMS" >  
  4. </uses-permission>  


方式一:通过广播监听短信消息

(注意:这种方式只对新收到的短消息有效,运行代码,并不会读取收件箱中已读或未读的消息,只有当收到新来的短消息时,才会执行onChange方法)


注册一个广播:

 copy
  1. <receiver android:name="com.dbjtech.acbxt.waiqin.SmsReciver" >  
  2.            <intent-filter android:priority="999">  
  3.                <action android:name="android.provider.Telephony.SMS_RECEIVED" />  
  4.            </intent-filter>  
  5.  </receiver>  

SmsReceiver.Java


  1. public class SmsReciver extends BroadcastReceiver {    
  2.     @Override  
  3.     public void onReceive(Context context, Intent intent) {  
  4.         Bundle bundle = intent.getExtras();  
  5.         SmsMessage msg = null;  
  6.         if (null != bundle) {  
  7.             Object[] smsObj = (Object[]) bundle.get("pdus");  
  8.             for (Object object : smsObj) {  
  9.                 msg = SmsMessage.createFromPdu((byte[]) object);  
  10.             Date date = new Date(msg.getTimestampMillis());//时间  
  11.                 SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");  
  12.                 String receiveTime = format.format(date);  
  13.                 System.out.println("number:" + msg.getOriginatingAddress()  
  14.                 + "   body:" + msg.getDisplayMessageBody() + "  time:"  
  15.                         + msg.getTimestampMillis());  
  16.                   
  17.                 //在这里写自己的逻辑  
  18.                 if (msg.getOriginatingAddress().equals("10086")) {  
  19.                     //TODO  
  20.                       
  21.                 }  
  22.                   
  23.             }  
  24.         }  
  25.     }  
  26.   
  27. }  

系统的这个广播是有序广播,就是当别的程序先获取到了这个广播再传递给你,当然它也可以干掉这个广播,让你接收不到,这样你的程序肯定是接收不到这个广播的了。我们发现,通过设置priority的数值,其实有时是不管用的,现在在一些定制的系统或是有安全软件的情况下,往往短消息都被截取到,并被干掉。

那么,我们只能使用方法二,监听短信数据库的变化,这种方式比方法一稍微复杂一些,不过使用起来也很方便,不受其它程序干扰~


方式二:通过短信数据库获取短信内容

(注意:这种方式可以获取手机上所有的短信,包括已读未读的短信,是不是很赞)

 copy
  1. private Uri SMS_INBOX = Uri.parse("content://sms/");  
  2. public void getSmsFromPhone() {  
  3. ContentResolver cr = getContentResolver();  
    String[] projection = new String[] { "body" };//"_id", "address", "person",, "date", "type  
    String where = " address = '1066321332' AND date >  "  
    + (System.currentTimeMillis() - 10 * 60 * 1000);  
    Cursor cur = cr.query(SMS_INBOX, projection, where, null, "date desc");  
    if (null == cur)  
    return;  
    if (cur.moveToNext()) {  
    String number = cur.getString(cur.getColumnIndex("address"));//手机号  
    String name = cur.getString(cur.getColumnIndex("person"));//联系人姓名列表  
    String body = cur.getString(cur.getColumnIndex("body"));  
    //这里我是要获取自己短信服务号码中的验证码~~  
    Pattern pattern = Pattern.compile(" [a-zA-Z0-9]{10}");  
    Matcher matcher = pattern.matcher(body);  
    if (matcher.find()) {  
    String res = matcher.group().substring(1, 11);  
    mobileText.setText(res);  
    }  
    }  
  4. }  

sms主要结构:  

  _id:短信序号,如100  
  thread_id:对话的序号,如100,与同一个手机号互发的短信,其序号是相同的  
  address:发件人地址,即手机号,如+86138138000  
  person:发件人,如果发件人在通讯录中则为具体姓名,陌生人为null  
  date:日期,long型,如1346988516,可以对日期显示格式进行设置  
  protocol:协议0SMS_RPOTO短信,1MMS_PROTO彩信  
  read:是否阅读0未读,1已读  
  status:短信状态-1接收,0complete,64pending,128failed  
  type:短信类型1是接收到的,2是已发出  
  body:短信具体内容  
  service_center:短信服务中心号码编号,如+8613800755500


通过方式二,我们就能获取手机中所有的短消息了,可是还有一个问题,如果来了新的短消息呢?我们总不能写个线程,每隔多少秒,去读取一下短信数据库吧?其实我们可以把方式二换个方式写:(内容观察者的方式)


  1. private SmsObserver smsObserver;  
  2.   
  3.     protected void onCreate(Bundle savedInstanceState) {  
  4.         super.onCreate(savedInstanceState);  
  5.         setContentView(R.layout.app_login);  
  6.         smsObserver = new SmsObserver(this, smsHandler);  
  7.         getContentResolver().registerContentObserver(SMS_INBOX, true,  
  8.                 smsObserver);  
  9.   
  10.     }  
  11.     public Handler smsHandler = new Handler() {  
  12.         //这里可以进行回调的操作  
  13.         //TODO  
  14.   
  15.     };  
  16.     class SmsObserver extends ContentObserver {  
  17.   
  18.         public SmsObserver(Context context, Handler handler) {  
  19.             super(handler);  
  20.         }  
  21.   
  22.         @Override  
  23.         public void onChange(boolean selfChange) {  
  24.             super.onChange(selfChange);  
  25.             //每当有新短信到来时,使用我们获取短消息的方法  
  26.             getSmsFromPhone();  
  27.         }  
  28.     }  

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值