https://www.cnblogs.com/dongweiq/p/4866022.html

if(TextUtils.isEmpty(number)||TextUtils.isEmpty(content))

  

       //getDefault拿到短信管理器
android.telephony.SmsManager manager =android.telephony.SmsManager.getDefault();
//分割短信 运营商规定短信的大小,如果写的多的话会分成好几条短信发送
ArrayList<String>message = manager.divideMessage(content); /*
* destinationAddress 目的地号码
* scAddress 第二个参数是服务中心号码
* parts 短信内容
* sentIntents 发送成功返回
* deliveryIntents 接受成功返回
*/
manager.sendMultipartTextMessage(number, null, message, null, null);

SMS涉及的主要类SmsManager

实现SMS主要用到SmsManager类,该类继承自java.lang.Object类,下面我们介绍一下该类的主要成员。

公有方法:

  • ArrayList<String> divideMessage(String text) 
    当短信超过SMS消息的最大长度时,将短信分割为几块。 
    参数:text——初始的消息,不能为空 
    返回值:有序的ArrayList<String>,可以重新组合为初始的消息
  • static SmsManager getDefault() 
    获取SmsManager的默认实例。 
    返回值:SmsManager的默认实例
  • void SendDataMessage(String destinationAddress, String scAddress, short destinationPort, byte[] data,PendingIntent sentIntent, PendingIntent deliveryIntent) 
    发送一个基于SMS的数据到指定的应用程序端口。 
    参数: 
    1)、destinationAddress——消息的目标地址 
    2)、scAddress——服务中心的地址or为空使用当前默认的SMSC 3)destinationPort——消息的目标端口号 
    4)、data——消息的主体,即消息要发送的数据 
    5)、sentIntent——如果不为空,当消息成功发送或失败这个PendingIntent就广播。结果代码是Activity.RESULT_OK表示成功,或RESULT_ERROR_GENERIC_FAILURE、RESULT_ERROR_RADIO_OFF、RESULT_ERROR_NULL_PDU之一表示错误。对应RESULT_ERROR_GENERIC_FAILURE,sentIntent可能包括额外的“错误代码”包含一个无线电广播技术特定的值,通常只在修复故障时有用。 
    每一个基于SMS的应用程序控制检测sentIntent。如果sentIntent是空,调用者将检测所有未知的应用程序,这将导致在检测的时候发送较小数量的SMS。 
    6)、deliveryIntent——如果不为空,当消息成功传送到接收者这个PendingIntent就广播。
    异常:如果destinationAddress或data是空时,抛出IllegalArgumentException异常。
  • void sendMultipartTextMessage(String destinationAddress, String scAddress, ArrayList<String> parts,ArrayList<PendingIntent> sentIntents, ArrayList<PendingIntent>  deliverIntents) 
    发送一个基于SMS的多部分文本,调用者应用已经通过调用divideMessage(String text)将消息分割成正确的大小。 
    参数: 
    1)、destinationAddress——消息的目标地址 
    2)、scAddress——服务中心的地址or为空使用当前默认的SMSC 
    3)、parts——有序的ArrayList<String>,可以重新组合为初始的消息 
    4)、sentIntents——跟SendDataMessage方法中一样,只不过这里的是一组PendingIntent 
    5)、deliverIntents——跟SendDataMessage方法中一样,只不过这里的是一组PendingIntent 
    异常:如果destinationAddress或data是空时,抛出IllegalArgumentException异常。
  • void sendTextMessage(String destinationAddress, String scAddress, String text, PendingIntent sentIntent,PendingIntent deliveryIntent) 
    发送一个基于SMS的文本。参数的意义和异常前面的已存在的一样,不再累述。

常量:

    • public static final int RESULT_ERROR_GENERIC_FAILURE 
      表示普通错误,值为1(0x00000001)
    • public static final int RESULT_ERROR_NO_SERVICE 
      表示服务当前不可用,值为4 (0x00000004)
    • public static final int RESULT_ERROR_NULL_PDU 
      表示没有提供pdu,值为3 (0x00000003)
    • public static final int RESULT_ERROR_RADIO_OFF 
      表示无线广播被明确地关闭,值为2 (0x00000002)
    • public static final int STATUS_ON_ICC_FREE 
      表示自由空间,值为0 (0x00000000)
    • public static final int STATUS_ON_ICC_READ 
      表示接收且已读,值为1 (0x00000001)
    • public static final int STATUS_ON_ICC_SENT 
      表示存储且已发送,值为5 (0x00000005)
    • public static final int STATUS_ON_ICC_UNREAD 
      表示接收但未读,值为3 (0x00000003)
    • public static final int STATUS_ON_ICC_UNSENT 
      表示存储但为发送,值为7 (0x00000007)

第一:调用系统短信接口直接发送短信;主要代码如下: 

/**
* 直接调用短信接口发短信
*
* @param phoneNumber
* @param message
*/
public void sendSMS(String phoneNumber, String message) {
// 获取短信管理器
android.telephony.SmsManager smsManager = android.telephony.SmsManager
.getDefault();
// 拆分短信内容(手机短信长度限制)
List<String> divideContents = smsManager.divideMessage(message);
for (String text : divideContents) {
smsManager.sendTextMessage(phoneNumber, null, text, sentPI,
deliverPI);
}
}

第二:调起系统发短信功能;主要代码如下: 

/**
* 调起系统发短信功能
* @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);
}
}

下面来主要讲解第一种方法,第一种方法可以监控发送状态和对方接收状态使用的比较多。

处理返回的状态代码如下:

//处理返回的发送状态
String SENT_SMS_ACTION = "SENT_SMS_ACTION";
Intent sentIntent = new Intent(SENT_SMS_ACTION);
sentPI= PendingIntent.getBroadcast(this, 0, sentIntent,
0);
// register the Broadcast Receivers
this.registerReceiver(new BroadcastReceiver() {
@Override
public void onReceive(Context _context, Intent _intent) {
switch (getResultCode()) {
case Activity.RESULT_OK:
Toast.makeText(MainActivity.this,
"短信发送成功", Toast.LENGTH_SHORT)
.show();
break;
case SmsManager.RESULT_ERROR_GENERIC_FAILURE:
break;
case SmsManager.RESULT_ERROR_RADIO_OFF:
break;
case SmsManager.RESULT_ERROR_NULL_PDU:
break;
}
}
}, new IntentFilter(SENT_SMS_ACTION)); //处理返回的接收状态
String DELIVERED_SMS_ACTION = "DELIVERED_SMS_ACTION";
// create the deilverIntent parameter
Intent deliverIntent = new Intent(DELIVERED_SMS_ACTION);
deliverPI = PendingIntent.getBroadcast(this, 0,
deliverIntent, 0);
this.registerReceiver(new BroadcastReceiver() {
@Override
public void onReceive(Context _context, Intent _intent) {
Toast.makeText(MainActivity.this,
"收信人已经成功接收", Toast.LENGTH_SHORT)
.show();
}
}, new IntentFilter(DELIVERED_SMS_ACTION));

别忘了权限的问题: 
<uses-permission android:name="android.permission.SEND_SMS" />

源码下载地址:http://download.csdn.net/detail/zyw_java/8917057

(转)Android之发送短信的两种方式的更多相关文章

  1. Android之发送短信的两种方式

    SMS涉及的主要类SmsManager 实现SMS主要用到SmsManager类,该类继承自java.lang.Object类,下面我们介绍一下该类的主要成员. 公有方法: ArrayList< ...

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

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

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

    Android手机上监听短信有两种方式: 1. 接受系统的短信广播,操作短信内容. 优点:操作方便,适合简单的短信应用. 缺点:来信会在状态栏显示通知信息. AndroidManifest.xml: ...

  4. android之发送短信程序

    首先改写activity_main.xml文件 代码如下: <LinearLayout xmlns:android="http://schemas.android.com/apk/re ...

  5. Android跟蓝牙耳机建立连接有两种方式

    Android 跟蓝牙耳机建立连接有两种方式. 1. Android 主动跟蓝牙耳机连BluetoothSettings 中和蓝牙耳机配对上之后, BluetoothHeadsetService 会收 ...

  6. Android 学习第13课,android 实现发送短信的功能

    1. 界面布局 界面代码: <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" ...

  7. Android之发送短信和接收验证码

      最近项目需求需要发送短信和接收验证码并将验证码显示在输入框中 以下是我的记录    前提---权限     <uses-permission android:name="andro ...

  8. Android SmsManager 发送短信

    SmsManager可以在后台发送短信,无需用户操作,开发者就用这个SmsManager功能在后台偷偷给SP发短信,导致用户话费被扣.必须添加android.permission.SEND_SMS权限 ...

  9. Android 中发送短信

    import android.net.Uri; //调用Android系统API发送短信 Uri uri = Uri.parse("smsto:" + strSmsPhone_va ...

随机推荐

  1. Real time profiler for Delphi applications

    xalion提供的资源,这么强,还是免费的,快去试用!   ✓  Detailed debug information (internal, TDS, MAP) ✓  Display informat ...

  2. 模拟setTimeOut

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

  3. Scrapy的使用

    建立好项目以后,在项目文件内scrapy会搭好框架,我们只需要按照框架设置. 先定义Item    它是保存爬取到的数据的容器,其使用方法和python的字典类似,并且提供了额外保护机制来避免拼写错误 ...

  4. JavaScript·aJax

    1.ajax 无刷新数据获取,ajax能且仅能从服务器读取文件 ajax_string ajax_数组 ajax_json ajax_分页 2.ajax原理 ajax请求: 1.创建ajax对象2.连 ...

  5. Dapp混合模型开发--Dice2win的解读

    前言: 之前讲到Dapp原生态对随机函数的支持并不友好, 现在讲讲一种解决思路. 既能保证随机函数的不可预测性, 又能保证公平性, 平台和玩家都能满意. 而Dapp中的Dice2Win实现, 刚好是其 ...

  6. 三、后门的编写和 ShellCode 的提取

    第三章.后门的编写和 ShellCode 的提取 (一)IP 和 Socket 编程初步 NOTES: 1.Windows 下网络通信编程的几种方式 第一种是基于 NetBIOS 的网络编程,这种方法 ...

  7. E - 改革春风吹满地

    按顺时针或者逆时针顺序输入n个点,求输入点围城的多边形的面积.凸凹都可以计算. 模板 #include <iostream> #include <cstring> #inclu ...

  8. Golang基本语法

    (1) 全局变量与局部变量 首先,得了解go代码块,也就是"{}",代码块外面访问不到代码块里面的变量. 在go语言里,变量民首写字母为大写则是全局变量,首写字母小写则是局部变量. ...

  9. ubuntu18.04 下利用conda安装opencv3

    ubuntu18.04 下利用conda安装opencv3 安装opencv3 conda install -c https://conda.anaconda.org/menpo opencv3 出现 ...

  10. C语言中的一维数组

    一.一维数组的定义和引用 (1)一维数组的定义 类型说明符表示数组中的元素类型 数组标识符该数组型变量的名称,命名规则与变量名一致 常量表达式定义了数组中存放的数据元素的个数. (2)一维数组的引用 ...