最近项目需求需要发送短信和接收验证码并将验证码显示在输入框中 以下是我的记录

   前提---权限

   

<uses-permission android:name="android.permission.SEND_SMS"></uses-permission>
<uses-permission android:name="android.permission.RECEIVE_SMS"></uses-permission>
<uses-permission android:name="android.permission.READ_SMS"></uses-permission>
  1.   发送短信并提示是否发送成功以及对方是否接收

    package com.javen.utils;
    
    import java.util.ArrayList;
    
    import android.app.Activity;
    import android.app.PendingIntent;
    import android.content.BroadcastReceiver;
    import android.content.Context;
    import android.content.Intent;
    import android.content.IntentFilter;
    import android.telephony.SmsManager;
    import android.widget.Toast; /**
    * @author Javen
    *
    */
    public class SendMessageUtil {
    /** 发送与接收的广播 **/
    private static String SENT_SMS_ACTION = "SENT_SMS_ACTION";
    private static String DELIVERED_SMS_ACTION = "DELIVERED_SMS_ACTION"; /**
    * 实现发送短信
    * @param context
    * @param text 短信的内容
    * @param phoneNumber 手机号码
    */
    public static void sendMessage(Context context, String text,
    String phoneNumber) {
    context.registerReceiver(sendMessage, new IntentFilter(SENT_SMS_ACTION));
    context.registerReceiver(receiver, new IntentFilter(
    DELIVERED_SMS_ACTION)); // create the sentIntent parameter
    Intent sentIntent = new Intent(SENT_SMS_ACTION);
    PendingIntent sentPI = PendingIntent.getBroadcast(context, 0, sentIntent,0);
    // create the deilverIntent parameter
    Intent deliverIntent = new Intent(DELIVERED_SMS_ACTION);
    PendingIntent deliverPI = PendingIntent.getBroadcast(context, 0,deliverIntent, 0); SmsManager smsManager = SmsManager.getDefault();
    //如果字数超过5,需拆分成多条短信发送
    if (text.length() > 70 ) {
    ArrayList<String> msgs = smsManager.divideMessage(text);
    for (String msg : msgs) {
    smsManager.sendTextMessage(phoneNumber, null, msg, sentPI, deliverPI);
    }
    } else {
    smsManager.sendTextMessage(phoneNumber, null, text, sentPI, deliverPI);
    }
    } private static BroadcastReceiver sendMessage = new BroadcastReceiver() { @Override
    public void onReceive(Context context, Intent intent) {
    // 判断短信是否发送成功
    switch (getResultCode()) {
    case Activity.RESULT_OK:
    Toast.makeText(context, "短信发送成功", Toast.LENGTH_SHORT).show();
    break;
    default:
    Toast.makeText(context, "发送失败", Toast.LENGTH_LONG).show();
    break;
    }
    }
    };
    private static BroadcastReceiver receiver = new BroadcastReceiver() {
    @Override
    public void onReceive(Context context, Intent intent) {
    // 表示对方成功收到短信
    Toast.makeText(context, "对方接收成功", Toast.LENGTH_LONG).show();
    }
    };
    }


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

    package com.example.message;
    
    import java.util.regex.Matcher;
    import java.util.regex.Pattern; import android.app.Activity;
    import android.content.ContentResolver;
    import android.content.Context;
    import android.database.ContentObserver;
    import android.database.Cursor;
    import android.net.Uri;
    import android.os.Bundle;
    import android.os.Handler;
    import android.widget.Toast; public class MainActivity extends Activity {
    private SmsObserver smsObserver; @Override
    protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    smsObserver = new SmsObserver(this, smsHandler);
    getContentResolver().registerContentObserver(SMS_INBOX, true,smsObserver);
    } public Handler smsHandler = new Handler() {
    // 这里可以进行回调的操作
    // TODO
    public void handleMessage(android.os.Message msg) {
    System.out.println("smsHandler 执行了.....");
    };
    }; private Uri SMS_INBOX = Uri.parse("content://sms/"); public void getSmsFromPhone() {
    ContentResolver cr = getContentResolver();
    String[] projection = new String[] { "body","address","person"};// "_id", "address",
    // "person",, "date",
    // "type
    String where = " date > "
    + (System.currentTimeMillis() - 10 * 60 * 1000);
    Cursor cur = cr.query(SMS_INBOX, projection, where, null, "date desc");
    if (null == cur)
    return;
    if (cur.moveToNext()) {
    String number = cur.getString(cur.getColumnIndex("address"));// 手机号
    String name = cur.getString(cur.getColumnIndex("person"));// 联系人姓名列表
    String body = cur.getString(cur.getColumnIndex("body")); System.out.println(">>>>>>>>>>>>>>>>手机号:" + number);
    System.out.println(">>>>>>>>>>>>>>>>联系人姓名列表:" + name);
    System.out.println(">>>>>>>>>>>>>>>>短信的内容:" + body); // 这里我是要获取自己短信服务号码中的验证码~~
    Pattern pattern = Pattern.compile("[a-zA-Z0-9]{5}");
    Matcher matcher = pattern.matcher(body);//String body="测试验证码2346ds";
    if (matcher.find()) {
    String res = matcher.group().substring(0, 5);// 获取短信的内容
    showToast(res);
    System.out.println(res);
    }
    }
    } protected void showToast(String text) {
    Toast.makeText(MainActivity.this, text, Toast.LENGTH_LONG).show();
    } class SmsObserver extends ContentObserver { public SmsObserver(Context context, Handler handler) {
    super(handler);
    } @Override
    public void onChange(boolean selfChange) {
    super.onChange(selfChange);
    // 每当有新短信到来时,使用我们获取短消息的方法
    getSmsFromPhone();
    }
    }
    }

    sms主要结构:  
      
      _id:短信序号,如100
      
      thread_id:对话的序号,如100,与同一个手机号互发的短信,其序号是相同的
      
      address:发件人地址,即手机号,如+86138138000
      
      person:发件人,如果发件人在通讯录中则为具体姓名,陌生人为null
      
      date:日期,long型,如1346988516,可以对日期显示格式进行设置
      
      protocol:协议0SMS_RPOTO短信,1MMS_PROTO彩信
      
      read:是否阅读0未读,1已读
      
      status:短信状态-1接收,0complete,64pending,128failed
      
      type:短信类型1是接收到的,2是已发出
      
      body:短信具体内容
      
      service_center:短信服务中心号码编号,如+8613800755500

    详细的数据库文件如下:

短信数据库分析

表结构分析:

address:短信发送者电话号码

person:联系人编号,如果电话薄里有联系人则显示编号,没有联系人则显示null

read:读取状态,0为未读,1为已读

body:短信内容

thread表:线程表

dataL:日期

message_count:短信发送的条数

snippet:最后一条短信内容

read:短信读取状态

Android之发送短信和接收验证码的更多相关文章

  1. android之发送短信程序

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

  2. Android SmsManager 发送短信

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

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

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

  4. (转)Android之发送短信的两种方式

    https://www.cnblogs.com/dongweiq/p/4866022.html if(TextUtils.isEmpty(number)||TextUtils.isEmpty(cont ...

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

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

  6. Android 中发送短信

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

  7. android 60 发送短信

    import android.os.Bundle; import android.app.Activity; import android.telephony.SmsManager; import a ...

  8. 至Android虚拟机发送短信和拨打电话

    Android的emulator是已经包括了gsm 模块,能够模拟电话与短信进行调试(就不用花太多冤枉钱) 首先,肯定是打开虚拟机: emulator -avd XXXXXX -scale 0.8&a ...

  9. Android 发送短信与接收短信

    package com.example.testsms; import android.app.Activity; import android.app.PendingIntent; import a ...

随机推荐

  1. Python 全栈开发 -- 开发环境篇

    开发环境是一个文本编辑器和 Python 解释器的组合.文本编辑器用来写代码,解释器提供了一种方法来运行编写的代码.一个文本编辑器可以像 Windows 上的 Notepad 一样简单,或是一个复杂的 ...

  2. DHTMLX 前端框架 建立你的一个应用程序 教程(十)--保存表单中的数据

    保存表单中的数据 现在我们所要做的是 当用户点击提交按钮的时候  我们将表单中的数据进行保存操作. 我们可以使用dhtmlxDataProcessor. 来进行操作.它是一个数据组件,可以提供与服务器 ...

  3. VC++下封装ADO类以及使用方法

    操作系统:windows 7软件环境:visual studio 2008 .Microsoft SQL 2005本次目的:介绍一个已经封装的ADO类,简单说明怎么导入使用 首先声明一下,这个封装的A ...

  4. webstrom使用记录

    很不方便的一点: 输入 $("#div p" 之后输入",就会变成$("#div p""" 这样,很不爽.

  5. S3C2410 ADS实验手册

    http://www.evernote.com/shard/s307/sh/b45f0e60-3232-4cbb-99f6-a273236a2faa/bd865ae048ac797585303ef54 ...

  6. scp传入固件,sysupgrade xx.bin升级固件

    scp传入固件,sysupgrade xx.bin升级固件

  7. poj3280Cheapest Palindrome(记忆化)

    链接 真的1A了.. 一开始想复杂了 想着补全再删 没想好 后来想到递归 大的回文串是由小的推过来的 一直递归下去 对于当前的i,j可以选择保留或者删除 选个最小的 #include <iost ...

  8. 【转】Xcode重构功能怎么用我全告诉你

    原文网址:http://www.cocoachina.com/ios/20160127/15097.html 你会经常需要重构你的代码,让它有更好的结构,可读性或者提高可维护性.Xcode作为IDE其 ...

  9. win7无法识别U盘,驱动信息:该设备的驱动程序未被安装。 (代码 28)

    台式机的win7 64位系统可以识别u盘,但笔记本的win7 64位却识别不了,说明U盘是可以用的.查看笔记本的设备管理器,发现驱动安装失败,提示信息为“该设备的驱动程序未被安装. (代码 28) ” ...

  10. nginx错误汇总

    一.Nginx出现413 Request Entity Too Large错误解决方法 Nginx出现的413 Request Entity Too Large错误,这个错误一般在上传文件的时候出现, ...