Android Studio第二期 - 短信自动填写项目流程讲解

首先这个东西是这样的流程:

不管你用mob还是移动还是自己的短信接口都一样的,在发送验证码的部分去请求,然后服务器返回给你短信息,然后你自己处理,达到效果。

这样一说就是只需要去监听短信息的数据库变化就可以了,并且要监听到你想要的那一条。

首先是

ContentObserver
import android.annotation.SuppressLint;
import android.content.Context;
import android.database.ContentObserver;

import android.database.Cursor;
import android.net.Uri;
import android.os.Handler;
import android.provider.Settings;
import android.util.Log;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class SmsObserver extends ContentObserver {

    private Context mContext;
    private Handler mHandler;

    public SmsObserver(Context context, Handler handler) {
        super(handler);
        mContext = context;
        mHandler = handler;
    }

    @SuppressLint("NewApi")
    @Override
    public void onChange(boolean selfChange, Uri uri) {
        super.onChange(selfChange, uri);

        Log.e("DEBUG", "SMS has changed!");
        Log.e("DEBUG", uri.toString());
//        try {
//            int isAirplaneOpen = Settings.System.getInt(mContext.getContentResolver(), Settings.System.AIRPLANE_MODE_ON);
//            Log.i("奇怪了", " isAirplaneOpen -----> " + isAirplaneOpen);
//            mHandler.obtainMessage(LoginActivity.MSG_RECEIVED_CODE, isAirplaneOpen)
//                    .sendToTarget();
//        } catch (Settings.SettingNotFoundException e) {
//            e.printStackTrace();
//        }
        String code = "";

        if (uri.toString().equals("content://sms/raw")) {
            return;
        }
        String[] projection = new String[]{"_id", "address", "body", "type"};
        Uri inboxUri = Uri.parse("content://sms/inbox");
        Cursor c = mContext.getContentResolver().query(inboxUri, projection, null,
                null, "date desc");
        if (c != null) {
            if (c.moveToFirst()) {
                int _id = c.getInt(c.getColumnIndex("_id"));
                String type = c.getString(c.getColumnIndex("type"));
                String address = c.getString(c.getColumnIndex("address"));
                String body = c.getString(c.getColumnIndex("body"));

                Log.e("--------address------", address);
                Log.v("-----草-----", "msgId : " + _id);
                Log.v("-----草-----", "msgAddr : " + type);
                Log.v("-----草-----", "msgBody : " + body);
                Log.v("-----草-----", "msgType : " + address);

                if (!address.contains("10657120610111")) {
                    return;//10657120610111
                }

                Log.e("DEBUG", "发件人为:" + address + " " + "短信内容为:" + body);

                Pattern pattern = Pattern.compile("(\\d{6})");
                Matcher matcher = pattern.matcher(body);

                if (matcher.find()) {
                    code = matcher.group(0);
                    Log.e("DEBUG", "code is " + code);

                    mHandler.obtainMessage(LoginActivity.MSG_RECEIVED_CODE, code)
                            .sendToTarget();
                }

            }
            c.close();
        }

    }
}

这个就是观察者模式的类,作用就是针对短信进行监听,根据其变化来获取短信息的内容,并且根据正则表达式去截取想要的数字,然后handle一下。

然后是

MainActivity
private SmsObserver mObserver;
public static final int MSG_RECEIVED_CODE = 1;

@SuppressLint("HandlerLeak")
private Handler mHandler2 = new Handler() {
    @Override
    public void handleMessage(Message msg) {
        if (msg.what == MSG_RECEIVED_CODE) {
            String code = (String) msg.obj;
            // update the UI
            inputCodeEt.setText(code);
        }
    }
};

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_login);
    init();
    mObserver = new SmsObserver(LoginActivity.this, mHandler2);
    Uri uri = Uri.parse("content://sms");
    getContentResolver().registerContentObserver(uri, true, mObserver);
}
@Override
protected void onDestroy() {
    getContentResolver().unregisterContentObserver(mObserver);
    super.onDestroy();
}

在main里面进行注册监听,别忘了最后要destroy

这样在监听状态下就会实时的对短信息的收发进行监听,并且得到我们想要的数字,通过子线程更新EditText达到自动填写的效果。

最后总结一下,一般像短信息啦,飞行模式啦什么设置之类的建议用ContentObserver搞,像什么推送啦,更新啦,视频聊天啦,建议用service搞,合理的分配内存使用,优化app的性能。

地址:http://down.51cto.com/data/2103679

时间: 2024-11-05 19:34:44

Android Studio第二期 - 短信自动填写项目流程讲解的相关文章

android: 接收和发送短信

8.2    接收和发送短信 收发短信应该是每个手机最基本的功能之一了,即使是许多年前的老手机也都会具备这 项功能,而 Android 作为出色的智能手机操作系统,自然也少不了在这方面的支持.每个 Android 手机都会内置一个短信应用程序,使用它就可以轻松地完成收发短信的操作,如 图 8.4 所示. 图   8.4 不过作为一名开发者,仅仅满足于此显然是不够的.你要知道,Android 还提供了一系 列的 API,使得我们甚至可以在自己的应用程序里接收和发送短信.也就是说,只要你有足 够的信

Android 2.3发短信详细流程

在android中,APP通过SmsManager.java一系列方法实现发送短信的功能,而发送的内容有很很多种,比如sendTextMessage.sendMultipartTextMessage.sendDataMessage等等,在这篇文章里我们就以其中一个为例阐述发送短信的完整流程,如果有不对的地方,请大家指正,一起学习. 1. 起点:SmsManager.java (frameworks/base/telephony/java/android/telephony/SmsManager.

安卓学习第二课——短信发送器

package com.example.message; import android.app.Activity; import android.os.Bundle; import android.telephony.SmsManager; import android.text.TextUtils; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button;

Android接收和发送短信

每一部手机都具有短信接收和发送功能,下面我们通过代码来实现接收和发送短信功能. 一.接收短信 1.创建内部广播接收器类,接收系统发出的短信广播 2.从获得的内容中解析出短信发送者和短信内容 3.在Activity中注册广播 4.添加接收短信权限 下面放上具体的代码 activity_main.xml文件用于显示短信发送者号码和显示短信内容 <?xml version="1.0" encoding="utf-8"?> <RelativeLayout

【转】如何向Android模拟器打电话发短信

转载地址:http://hi.baidu.com/jeremylai/item/420f9c9fe4881fccb62531f7 1. 启动Android Emulator, 查看标题栏找出端口.一般是android emulator(5554),其中5554就是端口. 2. 打开命令行,输入telnet localhost 5554.程序将会连接到android emulator,控制台会返回 Android Console: type ‘help’ for a list of command

向android模拟器打电话发短信的简单方法

在开发android应用程序时,有时候需要测试一下向android手机拨打电话发送短信时该应用程序的反应.譬如编写一个广播接收器,来提示用户有短信收到或者处理短信,就需要向该手机发送短信来进行测试.这里介绍一种简单的向android模拟器打电话发短信的方法. 该方法利用了eclipse ADT的DDMS来实现,首先点击打开DDMS,在eclipse界面的右上角,如图: 如果找不到,就点左边的图标,再点击others就会看到. 打开之后,在界面的左边中部会看见有一个Emulator Control

Android 类似未读短信图标显示数字效果的分析

之前一直以为是应用本身在对图标进行修改,看了源码之后发现其实主要的工作并不是应用自己完成的,主要的工作在是launcher里面完成的. 关于系统里面类似未读短信的具体处理流程如下, 原理 一个应用要实现这个效果,就要在自己有未读的消息的时候发送一个广播告诉系统我有未处理的事件了(例如:短信,电话和邮件等),同时将相关的信息进行保存,比如应用的名称(这里指的是ComponentName)和未处理事件的数量.系统将提升用户有待处理的事件交给Launcher去处理,launcher会接收到对应的广播,

[android] 手机卫士接收短信指令执行相应操作

通过广播接收者,接收到短信,对短信内容进行判断,如果为我们指定的值就执行相应的操作 如果短信内容是”#*location*#” 就执行,获取手机位置 如果短信内容是”#*alarm*#” 就执行,播放报警音乐 如果短信内容是”#*wipedata*#” 就执行,远程清除数据 如果短信内容是”#*lockscrreen*#” 就执行,远程锁屏 把短信的优先级定义成1000 使用模拟器发送短息的时候,会自动给发送号码拼接上155xxxx等,判断时候会不准确,使用String对象的contains()

android 几种发送短信的方法

android中发送短信很简单, 首先要在Mainfest.xml中加入所需要的权限: ? 1 2 3 <uses-permission android:name="android.permission.SEND_SMS"></uses-permission> <uses-permission android:name="android.permission.READ_SMS"></uses-permission> &