短信发送

发短信第一件事是在manifest文件中添加权限

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

第一方法:调用系统发短信的应用

    /** * 调起系统功能发短信 * @param phoneNumber * @param message */  public void doSendSMSTo(String phoneNumber,String message){  if(PhoneNumberUtils.isGlobalPhoneNumber(phoneNumber)){  Intent intent = new Intent(Intent.ACTION_SENDTO, Uri.parse("smsto:"+phoneNumber));            intent.putExtra("sms_body", message);            startActivity(intent);  }  }  

第二:调用系统短信接口发送短信

// 对短信发送状态监听的广播接收器private SmsStatusReceiver mSmsStatusReceiver;
//对短信接受状态监听的广播接收器private SmsDeliveryStatusReceiver mSmsDeliveryStatusReceiver;
// 调用系统短信接口发送短信初始化private void initSendSms() {// TODO Auto-generated method stubsmsPhone = (EditText) findViewById(R.id.to);SmsContent = (EditText) findViewById(R.id.content_sms_content);send = (Button) findViewById(R.id.send_sms);// 注册短信发送成功后的广播接收器Actionfinal String SMS_SEND_ACTIOIN = "SMS_SEND";final String SMS_DELIVERED_ACTION = "SMS_DELIVERED";mSmsStatusReceiver = new SmsStatusReceiver();registerReceiver(mSmsStatusReceiver, new IntentFilter(SMS_SEND_ACTIOIN));mSmsDeliveryStatusReceiver = new SmsDeliveryStatusReceiver();registerReceiver(mSmsDeliveryStatusReceiver, new IntentFilter(SMS_DELIVERED_ACTION));// 发送短信send.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {// TODO Auto-generated method stub//这个意图包装了对短信发送状态回调的处理逻辑 PendingIntent sentIntent = PendingIntent.getBroadcast(SmsActivity.this, 1, new Intent(SMS_SEND_ACTIOIN), 0);//这个意图包装了对短信接受状态回调的处理逻辑 PendingIntent deliveryIntent = PendingIntent.getBroadcast(SmsActivity.this, 2, new Intent(SMS_DELIVERED_ACTION),0);SmsManager manager = SmsManager.getDefault();manager.sendTextMessage(smsPhone.getText().toString(), null,SmsContent.getText().toString(), sentIntent,deliveryIntent);}});}

//对于发送状态和接受状态的广播接收器的处理逻辑

/*** 短信发送后的发送状态广播接收器* * @author cindy* */public class SmsStatusReceiver extends BroadcastReceiver {private static final String TAG = "SmsStatusReceiver";@Overridepublic void onReceive(Context context, Intent intent) {Log.d(TAG, "SmsStatusReceiver onReceive.");switch (getResultCode()) {case Activity.RESULT_OK:Log.d(TAG, "Activity.RESULT_OK");break;case SmsManager.RESULT_ERROR_GENERIC_FAILURE:Log.d(TAG, "RESULT_ERROR_GENERIC_FAILURE");break;case SmsManager.RESULT_ERROR_NO_SERVICE:Log.d(TAG, "RESULT_ERROR_NO_SERVICE");break;case SmsManager.RESULT_ERROR_NULL_PDU:Log.d(TAG, "RESULT_ERROR_NULL_PDU");break;case SmsManager.RESULT_ERROR_RADIO_OFF:Log.d(TAG, "RESULT_ERROR_RADIO_OFF");break;}}}/*** 短信发送到对方后,对返回的对方接受状态的处理逻辑* * @author cindy* */public class SmsDeliveryStatusReceiver extends BroadcastReceiver {private static final String TAG = "SmsDeliveryStatusReceiver";@Overridepublic void onReceive(Context context, Intent intent) {Log.d(TAG, "SmsDeliveryStatusReceiver onReceive.");switch (getResultCode()) {case Activity.RESULT_OK:Log.i(TAG, "RESULT_OK");break;case Activity.RESULT_CANCELED:Log.i(TAG, "RESULT_CANCELED");break;}}}
smsManager.sendTextMessage(destinationAddress, scAddress, text, sentIntent, deliveryIntent)
//关于这个方法参数的说明

– destinationAddress:目标电话号码
– scAddress:短信中心号码,测试可以不填
– text: 短信内容
– sentIntent:发送 –>中国移动 –> 中国移动发送失败 –> 返回发送成功或失败信号 –> 后续处理 即,这个意图包装了短信发送状态的信息
– deliveryIntent: 发送 –>中国移动 –> 中国移动发送成功 –> 返回对方是否收到这个信息 –> 后续处理 即:这个意图包装了短信是否被对方收到的状态信息(供应商已经发送成功,但是对方没有收到)。

监听短信

也有两种方法,一种通过监听系统发出的广播监听新短信到来,action=android.provider.Telephony.SMS_RECEIVED
下面是这个broadcastReceiver的onreceive方法,

package com.vincent.org.networkapp.broadcastreceiver;import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.telephony.SmsMessage;
import android.util.Log;/*** 当系统接收到一个新消息时候系统发送一条action="android.provider.Telephony.SMS_RECEIVED"的广播。* 这是一条有序广播可能被截断,所以这个广播方式只对新短信有效,同时未必有效,可能被系统切断了就收不到了有新短信的广播。* * @author cindy* */
public class SmsReceiver extends BroadcastReceiver {private static final String SMS_RECEIVED_ACTION = "android.provider.Telephony.SMS_RECEIVED";private static final String TAG = "SmsReceiver";@Overridepublic void onReceive(Context context, Intent intent) {// TODO Auto-generated method stub//获取到这个intent的action是不是android.provider.Telephony.SMS_RECEIVEDLog.i(TAG, "action: " + intent.getAction());if (SMS_RECEIVED_ACTION.equals(intent.getAction())) {StringBuilder builder = new StringBuilder();//用于存储短信内容String sender = null;Bundle bundle = intent.getExtras();if (bundle != null) {Object[] pdus = (Object[]) bundle.get("pdus");// 根据pdus key获取短信消息mesg数组,
//数组每一个元素表示一个SMS消息。将每个pdu字节数组转化成SmsMessage对象,调用SmsMessage.createFromPdu,传入每个字节数组for (Object object : pdus) {SmsMessage message = SmsMessage.createFromPdu((byte[]) object);sender = message.getOriginatingAddress();builder.append(message.getMessageBody());Log.i(TAG, "sender: " + sender + " builder: " + builder);}if (!builder.toString().isEmpty()) {//如果短信不为空,发送一个自定义广播,把信息传递到activity上面显示Log.d(TAG, "send message broadcast ,action=sms_received");Intent intentbroadCast = new Intent();intentbroadCast.putExtra("content", builder.toString());
//发送人       intentbroadCast.putExtra("sender", sender);
//短信内容体intentbroadCast.setAction("sms_received");context.sendBroadcast(intentbroadCast);// 发送一个sms_received的广播}}}}}

自定义广播接收器

    class MessageReceiver extends BroadcastReceiver {private static final String SMS_RECEIVED_ACTION = "sms_received";private static final String TAG = "MessageReceiver";@Overridepublic void onReceive(Context context, Intent intent) {// TODO Auto-generated method stubLog.i(TAG, intent.getAction());// 是不是接收到我们自定义发送的广播?if (SMS_RECEIVED_ACTION.equals(intent.getAction())) {Log.i(TAG, "动态注册自定义广播接收器");Bundle bundle = intent.getExtras();//将接受短信的对方号码和短信内容输出到UI界面。   sender.setText(bundle.getString("sender"));content.setText(bundle.getString("content"));}}}// 注册广播接收器filter = new IntentFilter();filter.addAction("sms_received");receiver = new MessageReceiver();registerReceiver(receiver, filter);ondestry()方法内注销动态注册的广播接收器unregisterReceiver(receiver);

通过短信数据库获取短信内容

//sms信箱唯一路径
private final Uri SMS_INBOX = Uri.parse("content://sms/");private final Handler smsHandler = new Handler() {@Overridepublic void handleMessage(Message msg) {}};private SmsObserver smsObserver;// 短信数据库的观察者,当短信数据库发生改变时候就触发这个类的onchange方法// 当数据库发生改变时候,将触发这个类的onchange方法class SmsObserver extends ContentObserver {private static final String TAG = "SmsObserver";public SmsObserver(Handler handler) {super(handler);// TODO Auto-generated constructor stub}//当短信数据库发送改变是回调这个方法@Overridepublic void onChange(boolean selfChange) {// TODO Auto-generated method stubsuper.onChange(selfChange);List<SmsBean> list = getSmsFromPhone();if (list != null) {content.setText(list.toString());sender.setText(list.get(0).getNumber());Log.i(TAG, content.getText().toString());}}// 只是获取到address为15622204503的号码短信private List<SmsBean> getSmsFromPhone() {// TODO Auto-generated method stubContentResolver cResolver = getContentResolver();String[] projection = new String[] { "body", "address", "person" };// 返回的列名long data = System.currentTimeMillis() - 10 * 60 * 1000;String where = " address= '15622204503' AND date > " + data;//构建where语句Cursor cursor = cResolver.query(SMS_INBOX, projection, where, null,"date desc");if (null == cursor) {return null;}List<SmsBean> list = new ArrayList<SmsBean>();if (cursor.moveToNext()) {Log.i(TAG, "address: " + cursor.getColumnIndex("address") + "");String number = cursor.getString(cursor.getColumnIndex("address"));// 手机号String name = cursor.getString(cursor.getColumnIndex("person"));// 联系人名称String body = cursor.getString(cursor.getColumnIndex("body"));list.add(new SmsBean(number, name, body));}cursor.close();return list;}}// 通过查询短信数据库获取短信数据
//获取一个观察者实例,注册到SMS_INBOX上面,只要有短信到来就会触发smsObserver实例的onchange方法执行。smsObserver = new SmsObserver(smsHandler);getContentResolver().registerContentObserver(SMS_INBOX, true,smsObserver);

参考文献:
Android开发之监听或获取手机短信内容
监听SMS消息

Android手机上监听短信的两种方式

Android实战技巧之三十九:短信收发

android短信发送和接受相关推荐

  1. android短信功能裁剪,Android短信发送功能实现技巧分享

    如现在启动一模拟器id 号为5554,运行cmd telnet localhost 5554 输入help 可以看到很多用于模拟器中的功能命令 gsm call 134343434   // 便是呼叫 ...

  2. Android短信发送流程之多收件人发送(原)

    前面的< Android短信发送流程之长短信发送 >中介绍了长短信对于普通短信的区别,而对于多收件人的情况,在SmsMessageSender的queueMessage()方法中我们了解到 ...

  3. Android短信发送流程之长短信发送(原)

    从前面< Android短信发送流程之普通短信发送 >流程看到,长短信与普通短信的流程从SmsManager的sendMultipartTextMessage()方法开始区分,现在我们来看 ...

  4. Android短信发送

    1.布局文件: activity_sms.xml <?xml version="1.0" encoding="utf-8"?> <Linear ...

  5. Android短信发送流程之普通短信发送(原)

    我们先来看最简单的流程入手分析,即收件人只有一个,而且不是长短信的情况. 一.地址有效性检测 当点击发送按钮时,触发onClick事件: [java] view plaincopy @ComposeM ...

  6. Android 短信发送失败是如何监听到的

    之前做项目,遇到需求:在短信发送失败后,弹出对话框,提示失败,如果用户点击retry,则开始重新发送,否则什么都不干. 高通8.0短信发送失败处理: 平台发送短信后会监听短信是否发送成功,这里主要看失 ...

  7. android 数据存储----android短信发送器之文件的读写(手机+SD卡)

    本文实践知识点有有三: 1.布局文件,android布局有相对布局,线性布局,绝对布局,表格布局,标签布局等.各个布局能够嵌套的.本文的布局文件就是线性布局的嵌套 <LinearLayout x ...

  8. android短信发送流程,Android 发送短信程序

    [android]代码库mButton1.setOnClickListener(new Button.OnClickListener() { @Override public void onClick ...

  9. android短信发送乱码,解决CEMAPI发送中文短信时会乱码

    作者:陈缘 联系:luandao2000@gmail.com 博客:http://blog.csdn.net/luandao2000 主页:http://www.spbase.com 这个问题 所有用 ...

最新文章

  1. 捅破窗户纸:如何从过程到对象—For金色的海洋以及所有为面向对象而困惑的Tx...
  2. sql server 2000 数据库。 怎样用sql语句,在没有主键的情况下删除数据库中多条......
  3. pythonsvm图像分类_python图像处理之sift-kmeans-SVM图像分类
  4. 挂在“棒棒”上的音乐世家,“我因为父亲给的木棍和筷筒子,从此四代人走上音乐路”...
  5. List<Object> 转List<String>
  6. Unity3D常见面试题
  7. HTML 传输 字符转换 进制转换 15位 18位 时间戳 转换
  8. 求两个链表的第一个公共结点各种情况及三种思路分析
  9. 欧氏空间距离和内积_希尔伯特空间(Hilbert Space)
  10. FlashBuilder 4.6 破解序列号和方法
  11. Rocket-chip-l2bus
  12. 全球与中国处方太阳镜市场深度研究分析报告
  13. 微信小程序-小程序的宿主环境
  14. python re 查找字符串中是否含有汉字
  15. springboot+毕业设计管理系统 毕业设计-附源码221032
  16. 地平线4显示与服务器通讯发生错误,地平线4加载失败发生不明错误的解决方法 - 系统家园...
  17. 禁止触摸屏触控板手指缩放,需要这样处理
  18. AI作画的业界天花板被我找到了,AIGC模型揭秘 | 昆仑万维
  19. 《虚无的十字架》---作者东野圭吾 读后感
  20. Winter Camp I (下)

热门文章

  1. 使用Docker快速搭建Hfish蜜罐
  2. flask写接口文件打包成exe
  3. 如何将程序员写出来的程序打包成安装包(最简单的)
  4. 网址格式化:截取域名
  5. Mac使用VirtualBox安装Cent OS7
  6. python语句print type 1234的输出结果是_Python语句 print(type(1J))的输出结果是
  7. uniapp清除缓存和获取数据
  8. 核函数背后隐藏着怎样的映射
  9. 前端浏览器内存监控方式
  10. 获取国庆放假加班信息(记录)