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

   前提---权限

   

<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. 转:Linux Shell编程入门

    http://www.cnblogs.com/suyang/archive/2008/05/18/1201990.html 从程序员的角度来看, Shell本身是一种用C语言编写的程序,从用户的角度来 ...

  2. 如何让centos6.5在vm11里上网,连接网络?

    如何让centos在vm里连接网络?步骤有3,方可解决: 1.配置vm的虚拟网络编辑器 2.配置虚拟机centos 3.设置centos的ip地址 一.配置vm的虚拟网络编辑器

  3. Android(安卓)系统USB-OTG-HID外设通讯开发

    正在为客户开发的X射线荧光成分分析仪(简称手持XRF分析仪 ),采用了MT6577 Android方案来开发.其中负责发送X射线的X-Ray-Tube设备是通过USB口来控制的.为了完成控制,就要求我 ...

  4. 令人头疼的clientTop、scrollTop、offsetTop

    1.网络上流传的图片 2.稍微容易理解点的示意图 参考链接:http://blog.csdn.net/lidiansheng/article/details/7950751 3.言简意赅的示意图 4. ...

  5. 手势识别官方教程(7)识别缩放手势用ScaleGestureDetector.GestureDetector和ScaleGestureDetector.SimpleOnScaleGestureListener

    Use Touch to Perform Scaling As discussed in Detecting Common Gestures, GestureDetector helps you de ...

  6. App运营者必须知道的30款数据分析工具

    如今的移动应用早已不再是某种结构单一.功能简单的工具了.当我们的移动应用变得越来越庞杂,我们便会需要借用分析工具,来跟踪和分析App内的每一个部分.幸运的是,目前市面上有许多数据分析工具可供App开发 ...

  7. [Hadoop源码解读](一)MapReduce篇之InputFormat

    平时我们写MapReduce程序的时候,在设置输入格式的时候,总会调用形如job.setInputFormatClass(KeyValueTextInputFormat.class);来保证输入文件按 ...

  8. 根据价格范围筛选汽车(路由以及JS与Jquery)

    通过输入价格范围,来筛选汽车,主要方法是通过点击“查询”按钮,触发chaxun()方法,利用Jquery和JS获取输入的值,然后为相应的div加载相应的动作,通过更改路由的路径,以此来实现筛选车辆,然 ...

  9. uc浏览器qq浏览器广告过滤

  10. (转载)php array_merge 和 两数组相加区别

    (转载)http://www.cnblogs.com/shistou/archive/2013/03/16/2963586.html PHP中两个数组合并可以使用+或者array_merge,但之间还 ...