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

   前提---权限

   

<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. Mysql的列索引和多列索引(联合索引)

    转自:http://blog.chinaunix.net/uid-29305839-id-4257512.html 创建一个多列索引:CREATE TABLE test (      id       ...

  2. Maven引入依赖后自动下载并关联源码(Source)

    好多用 Maven 的时候会遇到这样一个棘手的问题: 就是添加依赖后由于没有下载并关联源码,导致自动提示无法出现正确的方法名,而且不安装反编译器的情况下不能进入方法内部看具体实现 . 其实 eclip ...

  3. 综合经验:IO读写错误必然导致程序崩溃

    仿佛是忽然间产生的问题,每次程序退出时候,必然崩溃,花了整整一天才找到原因,就是对数据库的IO读写错误.主要是因为析构函数调用了Disconnect函数,内容如下: void SFTPTool::Di ...

  4. HANA内存数据库与oracle数据库的性能比较

    链接: http://wenku.it168.com/redian/hana/ 1.传统磁盘数据库的基本访问模式.为了提高性能在产品和应用之间会加入缓存的内存区域.传统数据库性能瓶颈主要出现在一个是内 ...

  5. module_init宏解析

    在init.h中我们看到 #define module_init(x) __initcall(x); 还看到 #define __initcall(fn) device_initcall(fn) 还有 ...

  6. amaze UI的使用

    1.放置在独立的位置 2.引入核心css与js <link href="{sh::PUB}amaze-ui/css/amazeui.min.css" rel="st ...

  7. MySQL 内存监控

    上一篇blog介绍了因为sql查询information_schema表而导致内存暴涨的case. 今天顺便做了一个thd内存的监控: 先来介绍下MySQL的内存: 1. 线程内内存:thd-> ...

  8. 操作系统杂谈 mac 和linux windows若干概念

    Mac: vmware 安装:1.方式一通过FreeBSD方式用 darwin.iso引导加载dmg安装 2.通过制作cdr /iso  vmware安装mac插件 mac有 macpe 使用open ...

  9. google官方提供的编译android源码的环境初始化,Initializing a Build Environment

    原文网址:http://source.android.com/source/initializing.html Initializing a Build Environment IN THIS DOC ...

  10. android手机屏幕分辨率 及 sp dip(dp) px 区别 及高中低分辨率时处理

    分辨率,是指单位长度内包含的像素点的数量,它的单位通常为像素/英寸(ppi).以分辨率为1024×768的屏幕来说,即每一条水平线上包含有1024个像素点,共有768条线,即扫描列数为1024列,行数 ...