全栈工程师开发手册 (作者:栾鹏)
安卓教程全解

安卓短信功能全解:调用系统短信功能发送短信、彩信,使用SmsManager发送短信,并监听发送短信的投递情况,使用广播接收器监听接收的短信。

首先需要添加短信功能的权限

<uses-permission android:name="android.permission.SEND_SMS"/>
<uses-permission android:name="android.permission.RECEIVE_SMS"/>

调用系统短信功能发送短信

注意:由于目前手机多存在双卡双待、网络短信,所以还需要选择发送的卡,因此这里只会启动系统短信发送界面,还没有自动发送

调用发送函数
send_message("12345678911","这是代码发送的一条短信");短信发送函数private void send_message(String number,String message) {//使用系统短信服务栈发送短信Intent smsintent = new Intent(Intent.ACTION_SENDTO, Uri.parse("smsto:"+number));smsintent.putExtra("sms_body",message);startActivity(smsintent);  //由于目前手机多存在双卡双待、网络短信,所以还需要选择发送的卡,因此这里只会启动系统短信发送界面,还没有自动发送}

调用系统彩信功能发送媒体信息(彩信,邮件)

调用发送函数
send_mulmessage("12345678911","这是代码发送的一条彩信");彩信发送函数private void send_mulmessage(String number,String message) {//获得要附加的一个媒体的uriUri attached_Uri=Uri.parse("content://media/external/images/media/1");//创建一个新的MMS intentIntent mmsIntent=new Intent(Intent.ACTION_SEND,attached_Uri);mmsIntent.putExtra("sms_body", message);mmsIntent.putExtra("address", number);mmsIntent.putExtra(Intent.EXTRA_STREAM, attached_Uri);mmsIntent.setType("image/jpeg");startActivity(mmsIntent);}

使用SmsManager 发送sms短信信息

使用SmsManager短信管理器发送短信,不会启动系统短信发送界面,但是由于短信在发送成功、失败、接收者接收成功、失败、是否已读等消息,安卓系统都会通过广播形式向系统所有app进行广播,所以仍然会在系统自带短信功能中留下痕迹。

在使用SmsManager发送短信时,需要自定义短信发送广播接收事件、短信送达广播接收事件。另外要注意将短信按运营商的限制长度进行分割。

由于目前手机多存在双卡双待、网络短信,所以还需要选择发送的卡,这种自动发送的短信,没法选择发送模式,所以会存在发送失败的情况

调用发送函数
sendsms("12345678911","这是代码发送的一条短信");短信发送函数
private void sendsms(String number,String message) {//获取短信管理器   android.telephony.SmsManager smsManager = android.telephony.SmsManager.getDefault(); String sent_sms_action = "com.lp.app.send_sms_action";   //短信发送成功(只是一个名称)String delivered_sms_action ="com.lp.app.delivered_sms_action";  //短信送达成功(只是一个名称)//创建sentintent参数Intent sentIntent = new Intent(sent_sms_action);PendingIntent sendpi =PendingIntent.getBroadcast(getApplicationContext(), 0, sentIntent, PendingIntent.FLAG_UPDATE_CURRENT);//创建deliveryintent参数Intent deliveryIntent=new Intent(delivered_sms_action);PendingIntent deliverpi = PendingIntent.getBroadcast(getApplicationContext(), 0, deliveryIntent, PendingIntent.FLAG_UPDATE_CURRENT);//注册broadcast receiver,用于在消息发生成功或者失败时触发registerReceiver(new BroadcastReceiver(){@Overridepublic void onReceive(Context context, Intent intent) {String resulttext = "unknown";switch (getResultCode()) {case Activity.RESULT_OK:resulttext="发送成功";break;case android.telephony.SmsManager.RESULT_ERROR_GENERIC_FAILURE:resulttext="发送失败";break;case android.telephony.SmsManager.RESULT_ERROR_RADIO_OFF:resulttext="发送失败,无线处于关闭状态";break;case android.telephony.SmsManager.RESULT_ERROR_NULL_PDU:resulttext="发送失败,没有指定的PDU";break;case android.telephony.SmsManager.RESULT_ERROR_NO_SERVICE:resulttext="发送失败,无服务";break;default:break;}Log.v("发送的短信", resulttext);}}, new IntentFilter(sent_sms_action));  //用指定名称的事件来触发这个接收机//注册broadcast receiver,用于仅在接收人接收到sms消息后触发registerReceiver(new BroadcastReceiver(){@Overridepublic void onReceive(Context context, Intent intent) {String resulttext = "unknown";switch (getResultCode()) {case android.telephony.SmsManager.STATUS_ON_ICC_FREE:resulttext="自由空间";break;case android.telephony.SmsManager.STATUS_ON_ICC_READ:resulttext="接收且已读";break;case android.telephony.SmsManager.STATUS_ON_ICC_SENT:resulttext="存储且已发送";break;case android.telephony.SmsManager.STATUS_ON_ICC_UNREAD:resulttext="接收但未读";break;case android.telephony.SmsManager.STATUS_ON_ICC_UNSENT:resulttext="存储但未发送";break;default:break;}Log.v("发送的短信", resulttext);}},  new IntentFilter(delivered_sms_action)); //用指定名称的事件来触发这个接收机//拆分短信内容(手机短信长度限制)    List<String> divideContents = smsManager.divideMessage(message);   for (String text : divideContents) {    //由于目前手机多存在双卡双待、网络短信,所以还需要选择发送的卡,这种自动发送的短信,没法选择发送模式,所以会存在发送失败的情况smsManager.sendTextMessage(number, null, text, sendpi, deliverpi);    //参数:接收人,所有用的SMS服务中心,消息内容,跟踪传输的intent,消息成功递送的intent//smsManager.sendDataMessage(destinationAddress, scAddress, destinationPort, data, sentIntent, deliveryIntent);  //发送byte[]//smsManager.sendMultipartTextMessage(destinationAddress, scAddress, parts, sentIntents, deliveryIntents);  //发送多部分字符串内容}

广播监听接收到的短信

在系统接收到短信后,系统会全局广播一个事件,事件中附加了短信的全部内容信息,我们可以通过注册广播接收来获取短信内容和相关信息。

1、首先在manifest中注册一个广播接收

<!-- 短信接收监视-->
<receiver android:name="com.lp.app.advice.SMSReceiver" ><intent-filter><action android:name="android.provider.Telephony.SMS_RECEIVED"/></intent-filter>
</receiver>

2、自定义广播接收器,解析接收到的短信

import android.content.Intent;
import android.os.Bundle;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.util.Log;//使用intent receiver监视接收的短信
public class SMSReceiver extends BroadcastReceiver {@Overridepublic void onReceive(Context context, Intent intent) {Bundle bundle=intent.getExtras();if (bundle!=null) {Object[] pdus = (Object[])bundle.get("pdus"); //pdus是一个object类型的数组,每一个object都是一个byte[]字节数组,每一项为一条短信。android.telephony.SmsMessage[] messages = new android.telephony.SmsMessage[pdus.length];for (int i = 0; i < pdus.length; i++) messages[i]=android.telephony.SmsMessage.createFromPdu((byte[])pdus[i]);for(android.telephony.SmsMessage message: messages){String msg = message.getMessageBody();   //获取消息内容long when = message.getTimestampMillis();  //获取消息时间戳String from =message.getOriginatingAddress();  //获取消息来源Log.v("接收到的短息", "消息:"+msg);Log.v("接收到的短息", "时间:"+when);Log.v("接收到的短息", "发件人:"+from);}}}
}

安卓短信功能全解:调用系统短信功能发送短信、彩信,使用SmsManager发送短信,并监听发送短信的投递情况,使用广播接收器监听接收的短信。相关推荐

  1. 安卓调用系统语音识别功能全解(谷歌语音服务):获取识别结果,使用语音识别进行搜索。

    全栈工程师开发手册 (作者:栾鹏) 安卓教程全解 安卓调用系统语音识别功能全解(谷歌语音服务):获取识别结果,使用语音识别进行搜索. 首先要添加权限 <uses-permission andro ...

  2. 14.3.1 调用系统的拍照功能

    14.3.1 调用系统的拍照功能 http://book.51cto.com  2010-06-22 14:19  李宁  中国水利水电出版社  我要评论(0) 摘要:<Android/OPho ...

  3. (洛谷入门系列,适合洛谷新用户)洛谷功能全解

    目录 前注 前言 第一章 进入方式 1.1 基础操作 1.2 两步验证 1.3 安全邮箱和安全手机 第二章 侧栏与主界面介绍 2.1 蓝底白色洛谷标志 2.2 "应用>>&quo ...

  4. rpm包管理功能全解

    rpm包管理功能全解 rpm包管理功能全解              linux rpm问题:怎样查看rpm安装包的安装路径                      rpm -qa l grep   ...

  5. android 监听多个广播,同一个广播接收器监听多个广播及多个广播接收器监听同一个广播...

    1.  同一个广播接收器可以同时监听多个广播,同一个广播发出后也可被多个广播接收器监听,就像一个电台可以被 多个收音机收到一样 2.  当使用同一个广播接收器接收多个广播时可以在AndroidMani ...

  6. 安卓自定义相机拍照功能全解(不调用系统相机)

    全栈工程师开发手册 (作者:栾鹏) 安卓教程全解 安卓实现一个相机的基本功能. 启动和释放相机 由于拍照功能一般需要实时预览,所以比较耗电,因此在窗口的恢复和暂停函数中需要启动和释放相机 privat ...

  7. 安卓自定义相机录像功能全解(不调用系统相机)

    全栈工程师开发手册 (作者:栾鹏) 安卓教程全解 安卓录制视频需要使用MediaRecorder来完成.并且在录制中一般还需要SurfaceHolder进行实时预览,所以在布局文件中进行预览的Surf ...

  8. 安卓蓝牙bluetooth开发全解

    全栈工程师开发手册 (作者:栾鹏) 安卓教程全解 安卓蓝牙开发全解.启动蓝牙.启动可发现机制.广播监听蓝牙状态.广播监听蓝牙可发现机制状态.发现远程蓝牙设备.蓝牙设备作为服务器端.蓝牙设备作为客户端. ...

  9. 硬盘开启NCQ功能全解

    硬盘发展的速度大家是有目共睹的,在2005年,SATA接口的硬盘顺利代替了PATA硬盘,成为市场中主流的热点产品.而在2005年末,关于SATA硬盘的一项新的技术NCQ又进入了人们的视野. 对于硬盘的 ...

最新文章

  1. Linux中listen()系统调用的backlog参数分析
  2. window.location.reload() 刷新页面时,如何不弹出提示框
  3. Visual C++设计UDP协议通讯示例
  4. html请求接口_前端工程师吐后端工程师(第八讲)——接口的开发
  5. 源码安装 odoo12 -- 问题记录
  6. 全面解析Inception Score原理及其局限性
  7. android p wifi一直在扫描_Android再次解读萤石云视频
  8. scss、sass 和 css 的区别
  9. 怎样在hdfs上创建多级目录文件夹_【HDFS API编程】第一个应用程序的开发-创建文件夹...
  10. 推荐阅读啃饼随笔的《玩聚网的案例分析》
  11. java8 Stream 使用案例
  12. ReentrantLock和synchronized锁
  13. SSM框架二手车交易网站源码+文档
  14. java pdf域插入img_java实现在pdf模板的指定位置插入图片
  15. 安卓用户必备的5款良心APP,各个都是精品,低调又实用!
  16. 数据库Geometry字段操作
  17. 根据网络上的视频的m3u8文件通过ffmpeg进行合成视频
  18. cad图纸怎么看懂_cad学习技巧:如何快速看懂图纸
  19. LibreOJ #6177. 「美团 CodeM 初赛 Round B」送外卖2【状压DP】
  20. echarts 地图九状线显示钓鱼岛系列 (2) 之 china1.js文件 ( china-v.js)

热门文章

  1. 第P题 扔盘子(双重循环就行) 详解=====有一口井,井的高度为N,每隔1个单位它的宽度有变化。现在从井口往下面扔圆盘,如果圆盘的宽度大于井在某个高度的宽度
  2. php url参数用–,php获取URL各部分参数
  3. 【狂神MySQL笔记】常用命令行语句(1)
  4. 笔记本电脑如何保养_笔记本电脑过热 五招教你轻松解决
  5. php编写九九乘法表隔行换色,JavaScript实现99乘法表及隔行变色实例代码
  6. 218.94.78.76:20001/index.php,详解spring中使用Elasticsearch的实例教程
  7. layUI提交多个相同name的值
  8. Exception in thread http-apr-8080-exec-
  9. linux pv信息写在哪里,linux命令PV介绍
  10. php到岗第一天都做什么,十天学会php之第一天