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. 洛谷P1850 换教室

    令人印象深刻的状态转移方程... f[i][j][0/1]表示前i个换j次,第i次是否申请时的期望. 注意可能有重边,自环. 转移要分类讨论,距离是上/这次成功/失败的概率乘相应的路程. 从上次的0/ ...

  2. bug7 java.net.BindException: 端口被占用。

    java.net.BindException:   端口被占用. java.net.BindException:   端口被占用.

  3. react中实现点击跳转到新页面方法

    实现点击跳转到新页面,可以有两种形式,一个是本地页面打开,一个是本地页面不变跳转到新的页面. (一)页面点击本地页面打开新页面 引入ant的Button组件 <Button style={{ba ...

  4. Spring核心组件剖析

    简介 Spring框架如今已成为服务端开发框架中的主流框架之一,是web开发者的利器.然而,真正让人着迷的,还是与其实现相关的 原理,设计模式以及许多工程化的思想.本文主要探讨Spring的三大核心组 ...

  5. laravel 模型事件 updated 触发条件

    1. 只有 $sku->{attribute} != $sku->getOriginal({attribute}) 不一致的时候才会触发 getDirty() 不为空的时候才触发, 而且不 ...

  6. Centos7.2安装搜狗拼音

    方法一: Fedora 19/20/21/rawhide 使用以下命令添加源: # yum install dnf-plugins-core # dnf copr enable mosquito/my ...

  7. Java 读取文件的内容

    Java 读取文件的内容 1) CLASS_NAME: 换成自己真实的类名 2) /page/test.json: 换成自己真实的page 3) FileUtils: 来自于org.apache.co ...

  8. SQL Server 2008 数据库回滚到某个时间点

    数据库回滚到时间的的前提: 事务日志完整,数据库在完整恢复模式下进行过一次完整备份,数据库没有进行过还原操作(惨痛教训). 当数据库误操作时,切记冷静,不然问题就是滚雪球, 在不做下一步错误前  可观 ...

  9. 获取CPU序列号、网卡MAC地址、硬盘序列号

    <pre name="code" class="csharp"> using System; using System.Collections; u ...

  10. javascript 拖拽事件

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...