Android通讯之短信功能实现:

使用android.telephony.SmsManager对象,可以发送短信和彩信。
// 构造回调函数,短信发送结束后,会发出对应的Intent请求
Intent intent = new Intent("com.sample.sms_sent");
intent.putExtra("sms_id",GenerateSmsId());
PendingIntent pendingIntent = PendingIntent.getBroadcast(context,0,intent,0);

// 发送文本短信   
SmsManager smsManager = SmsManager.getDefault();
smsManager.sendTextMessage(phone_number, null, text_content, pendingIntent,null);

其中,pendingIntent 对象是一个异步的Intent请求,当短信发送完成后,会触发预设在其中的广播事件;通过监听该广播事件,可以获知短信发送的结果:
// 在对应的触发器组件中,监听并处理短信发送的结果
@Override
protected void onHandleIntent(Intent intent){
    if("com.sample.sms_sent".equals(intent.getAction())){
    long sms_id = intent.getLongExtra("sms_id",0);
    int result = intent.getIntExtra("result",0);
    // 处理不同的发送结果
    if(result == Activity.RESULT_OK){
        // 发送成功
        ......
    } else{
        // 发送失败
        ......
    }
    }
}
通过该方式发送短信,无法与系统的短信数据库整合起来,也就是说通过这种发送出去的短信,无法在其他短信应用中查看,也无法通过其他短信应用来管理其状态。
在很多场景下,开发者如果不是期望在后台发送短信,可以通过发送Intent请求,调用第三方短信应用的界面组件来实现短信的发送。在这种方式下,用户可以对准备发送的短信进行确认和修改,并自行进行发送:
/* 构造短信发送的Intent对象,如果使用Action为Intent.ACTION_SENDTO的方式,可以包含目标地址;如果使用Action为Intent.ACTION_SEND的方式,可以预设短信内容等。*/
final Uri sms = Uri.parse("smsto:1234567");
Intent intent = new Intent(Intent.ACTION_SENDTO,sms);
startActivity(intent);

调用第三方短信界面组件发送短信,不仅能节约开发编辑短信界面的成本,还可以申请短信发送权限,只要场景合适,应该优先使用该方式。但基于第三方组件发送短信的方式,需要用户再次确认,并且无法确认最终的发送结果,在有些场景下并不适合。这时候,就要考虑将短信插入到系统短信数据库的待发送队列来进行短信发送。通过这样的方式,将短信的发送整合到系统短信数据库中,可以通过其他短信应用查看,也可以实现后台的发送和控制。
// 构造需要发送的短信,在对应的数据列上插入对应的值
ContentValues values = new ContentValues();
values.put("address",TARGET_ADDRESS); // 短信地址
values.put("body",SMS_CONTENT); // 短信内容
values.put("type",6); // 短信的类型,6代表待发送短信
values.put("date",CurrentDate()); // 短信发送时间
......
// 将短信插入到数据源
Uri insertUri = getContentResolver().insert("content://sms",values);
// 从插入的地址信息中解析出短信id,通过这个id值,随时可以在数据源中查看短信的状态、内容等信息
long sms_id = Long.valuesOf(insertUri.getLastPathSegment());
......

基于该方式进行的短信发送,可能还存在一定得兼容性隐患。短信数据源属于系统隐藏的数据源组件,其接口和数据库接口的稳定性都不给予保证。一旦在未来某个版本中,短信数据源的地址或数据库结构进行了变更,基于该方式进行的短信发送就可能会失效。

当Android系统从通信底层获取到新的短信信息后,会发出Action为android.provider.Telephony.SMS_RECEIVED的广播事件,通过监听该事件可以读取到新短信的短信内容:
@Override
protected void onHandleIntent(Intent intent){
    // 从化名为pdus的Extra域中,读取新短信的内容
    Object[] pdus = (object[]) bundle.get("pdus");
    // 把所有数据块中的内容抽取出来,拼接成完整的短信内容
    String sms_content;
    SmsMessage[] messages = new SmsMessage[pdus.length];
    for( int i=0;i<messages.length;i++){
    messages[i] = SmsMessage.createFromPdu((byte[]) pdus[i]);
    sms_content += messages[i].getDisplayMessageBody();
    }
    // 其余信息,均可以从第一个短信数据块中抽取出来
    SmsMessage first_message = messages[0];
    String address = first_message.getDisplayOriginatingAddress();
    int status = first_message.getStatus();
    ......
}

在实际开发中,需要特别留意该触发器组件的优先级。因为该广播事件是一个有序的事件广播,系统会按照触发器组件的优先级,从高到低依次进行通知。

Androidmanifest中添加发送短信的权限:
<uses-permission android:name="android.permission.SEND_SMS" />
<uses-permission android:name="android.permission.RECEIVE_SMS" />  

示例代码下载链接:http://www.apkbus.com/android-137411-1-1.html
参考文章链接:

Android通讯:短信的更多相关文章

  1. Android获取短信验证码

    Android开发中关于短息验证码的设计层出不穷,越来越多的应用为了更好的提高软件的安全性,开始使用通过服务器向用户发送验证码的方式,来保护用户个人信息的安全性.无论是用户注册时的信息验证还是当用户发 ...

  2. Android接收短信

    Android收到短信时会广播android.provider.Telephony.SMS_RECEIVED消息,因此只要定义一个Receiver,收听该消息,就能接收短信. <receiver ...

  3. android拦截短信并屏蔽系统的Notification

    拦截短信有几个关键点: 1.android接收短信时是以广播的方式 2.程序只要在自己的Manifest.xml里加有"接收"SMS的权限 <uses-permission  ...

  4. android 发送短信 怎样做到一条一条的发送,仅仅有在上一条发送成功之后才发送下一条短信

    android发送短信截获上一条发送是否成功,然后再来发送下一条短信 1.问题:在项目中遇到例如以下要求:待发短信有N条,实现一条一条的发送并在上一条短信发送成功之后再来发送下一条. for(int ...

  5. android 发送短信的两种方式,以及接收报告和发送报告

               android发送短信,以及接收报告和发送报告          android中发送短信其实有两种方式,这个和打电话类似,大家可以了解一下:    一.调起系统发短信功能    ...

  6. android 获取短信验证码倒计时

    android 获取短信验证码倒计时 watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvbWVuZ2xlbGUxMzE0/font/5a6L5L2T/fonts ...

  7. Android之——短信的备份与还原

    转载请注明出处:http://blog.csdn.net/l1028386804/article/details/47091281 眼下,Android手机中的一些软件能够实现手机短信的备份与还原操作 ...

  8. ThinkPHP 提供Auth 权限管理、支付宝、微信支付、阿里oss、友盟推送、融云即时通讯、云通讯短信、Email、Excel、PDF 等等

    多功能 THinkPHP 开源框架 项目简介:使用 THinkPHP 开发项目的过程中把一些常用的功能或者第三方 sdk 整合好,开源供亲们参考,如 Auth 权限管理.支付宝.微信支付.阿里oss. ...

  9. 用Tasker实现收到Android手机短信自动转发到邮箱

    发送短信到邮箱的原理与 <用Tasker实现收到Android手机短信自动转发到邮箱>有些类似.  发送短信到邮箱是利用Ifttt这个服务将短信转发到邮箱中.Ifttt服务的可扩展性很强, ...

  10. android接收短信——framework处理流程(android 5.1)

    modem层不懂,所以直接从RIL.java开始.以电信卡接收短信为例 modem通知RIL.java中的 RILReceiver处理接收信息 class RILReceiver implements ...

随机推荐

  1. A1048. Find Coins

    Eva loves to collect coins from all over the universe, including some other planets like Mars. One d ...

  2. Django model中的 class Meta 详解

    通过一个内嵌类 "class Meta" 给你的 model 定义元数据, 类似下面这样: class Foo(models.Model): bar = models.CharFi ...

  3. 关于vue-devtools安装

    两种方法. 第一种:使用https://chrome.google.com/webstore/detail/vuejs-devtools/nhdogjmejiglipccpnnnanhbledajbp ...

  4. excel自动化翻译2

    Python爬虫视频教程零基础小白到scrapy爬虫高手-轻松入门 https://item.taobao.com/item.htm?spm=a1z38n.10677092.0.0.482434a6E ...

  5. Swift真机调试时报错dyld: Library not loaded: @rpath/libswiftCore.dylib

    dyld: Library not loaded: @rpath/libswiftCore.dylib Referenced from: /private/var/mobile/Containers/ ...

  6. springcloud报错集合

    springcloud启动报错Connection refused: connect 参考:https://blog.csdn.net/deemo__/article/details/78932401 ...

  7. Cloud9 开发环境部署

    安装和部署 cloud9 云端开发环境 简介 Cloud9 是亚马逊发布的一款基于云端的开发环境. AWS Cloud9 是一种基于云的集成开发环境 (IDE),您只需要一个浏览器,即可编写.运行和调 ...

  8. fastjson基本使用 (待继续完善)【原】

    参考: http://blog.csdn.net/wx_962464/article/details/37612861 maven库下载 fastjson基本样例1 Cat.java package ...

  9. 牛客多校第十场-D- Rikka with Prefix Sum

    链接:https://www.nowcoder.com/acm/contest/148/D来源:牛客网 Prefix Sum is a useful trick in data structure p ...

  10. css/css3常用收集/笔记

    _______________________________________________________________  css3 瀑布流 N 列 <ul><li>aa ...