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

   前提---权限

   

<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. 静态分析安全测试(SAST)优缺点探析

    静态分析安全测试(SAST)是指不运行被测程序本身,仅通过分析或者检查源程序的语法.结构.过程.接口等来检查程序的正确性,那么采用静分析安全测试的方法有什么优缺点呢,且让小编给你说道说道. 许多公司都 ...

  2. 移动开发:初学 iOS-UIViewController 心得

    初学 iOS,本文翻译了一些 iOS 官网上的 UIViewController 的知识点,如有不到位或不正确的地方,还请指正: 本文所介绍的内容的目标: 理解content view control ...

  3. HDU 1025 Constructing Roads In JGShining's Kingdom(DP+二分)

    点我看题目 题意 :两条平行线上分别有两种城市的生存,一条线上是贫穷城市,他们每一座城市都刚好只缺乏一种物资,而另一条线上是富有城市,他们每一座城市刚好只富有一种物资,所以要从富有城市出口到贫穷城市, ...

  4. solr的原子更新/局部更新

    solr支持三种类型的原子更新: set - to set a field. add - to add to a multi-valued field. inc - to increment a fi ...

  5. 【Xamarin挖墙脚系列:Xamarin.IOS机制原理剖析】

    原文:[Xamarin挖墙脚系列:Xamarin.IOS机制原理剖析] [注意:]团队里总是有人反映卸载Xamarin,清理不完全.之前写过如何完全卸载清理剩余的文件.今天写了Windows下的批命令 ...

  6. Android EditText如何去除边框添加下划线

    (一)问题 之前的自定义EditText只能显示高度不超过屏幕高度的文本内容,继续增加内容会出现如下问题: (二)原因分析 下部(超出屏幕高度的部分)没有继续画线,也就是说横线没有画够,那么一定是循环 ...

  7. UltraEdit (Ctrl + F) 查找、(Ctrl + R)替换功能失效

    环境: Windows 7 Service Pack 1 X64 工具: UltraEdit Version 21 症状: UltraEdit (Ctrl + F) 查找.(Ctrl + R)替换功能 ...

  8. .net 破解的几个常用工具

    在.net 破解中我们经常会提到 Reflector\SimpleAssemblyExplorer和CFF Explore这几个工具. 我们以一个简单的确Windows Form程序为例来说说他们怎么 ...

  9. Linux kernel 拒绝服务漏洞

    漏洞名称: Linux kernel 拒绝服务漏洞 CNNVD编号: CNNVD-201311-020 发布时间: 2013-11-05 更新时间: 2013-11-05 危害等级:    漏洞类型: ...

  10. Oracle rman 命令详解

    一.list常用命令总结备忘 list命令列出控制文件.RMAN恢复目录中备份信息, 是我们对所有可见的数据库备份文件的一个最直观的了解的方法 list incarnation;    list ba ...