Repository: Robin-jiangyufeng/SmsObserverForAndroid
Branch: master
Commit: a73ba1a92df0
Files: 32
Total size: 19.7 KB
Directory structure:
gitextract_p7yb6gkq/
├── .gitignore
├── README.md
├── Sample/
│ ├── .gitignore
│ ├── build.gradle
│ ├── proguard-rules.pro
│ └── src/
│ ├── androidTest/
│ │ └── java/
│ │ └── com/
│ │ └── robin/
│ │ └── lazy/
│ │ └── sample/
│ │ └── ApplicationTest.java
│ ├── main/
│ │ ├── AndroidManifest.xml
│ │ ├── java/
│ │ │ └── com/
│ │ │ └── robin/
│ │ │ └── lazy/
│ │ │ └── sample/
│ │ │ ├── App.java
│ │ │ └── MainActivity.java
│ │ └── res/
│ │ ├── layout/
│ │ │ └── activity_main.xml
│ │ ├── values/
│ │ │ ├── colors.xml
│ │ │ ├── dimens.xml
│ │ │ ├── strings.xml
│ │ │ └── styles.xml
│ │ └── values-w820dp/
│ │ └── dimens.xml
│ └── test/
│ └── java/
│ └── com/
│ └── robin/
│ └── lazy/
│ └── sms/
│ └── ExampleUnitTest.java
├── SmsObserverLibrary/
│ ├── .gitignore
│ ├── build.gradle
│ ├── proguard-rules.pro
│ └── src/
│ ├── androidTest/
│ │ └── java/
│ │ └── com/
│ │ └── robin/
│ │ └── lazy/
│ │ └── sample/
│ │ └── ApplicationTest.java
│ ├── main/
│ │ ├── AndroidManifest.xml
│ │ ├── java/
│ │ │ └── com/
│ │ │ └── robin/
│ │ │ └── lazy/
│ │ │ └── sms/
│ │ │ ├── DefaultSmsFilter.java
│ │ │ ├── SmsFilter.java
│ │ │ ├── SmsHandler.java
│ │ │ ├── SmsObserver.java
│ │ │ ├── SmsResponseCallback.java
│ │ │ └── VerificationCodeSmsFilter.java
│ │ └── res/
│ │ └── values/
│ │ └── strings.xml
│ └── test/
│ └── java/
│ └── com/
│ └── robin/
│ └── lazy/
│ └── sms/
│ └── ExampleUnitTest.java
├── build.gradle
├── gradle.properties
└── settings.gradle
================================================
FILE CONTENTS
================================================
================================================
FILE: .gitignore
================================================
*.iml
.gradle
/local.properties
/.idea/workspace.xml
/.idea
/.idea/libraries
.DS_Store
/build
/captures
/gradle
gradlew
gradlew.bat
================================================
FILE: README.md
================================================
# 项目介绍
### 项目地址:
[SmsObserverForAndroid](https://github.com/Robin-jiangyufeng/SmsObserverForAndroid)
### 介绍
* 这是一个用于拦截android实时短信的库,可以进行短信过滤,得到自己想要的内容,可以用于需要自动填写短信验证码的app项目
### 功能
* 用于监听当前接收到的短信信息
* 过滤接收到的短信,得到自己想要的内容
### 使用场景
* 可以用于自动填写短信验证码的app项目
* 自己想...
# 使用方法
### 所需权限
```java
```
### 初始化
```java
/***
* 构造器
* @param context
* @param callback 短信接收器
* @param smsFilter 短信过滤器
*/
SmsObserver smsObserver=new SmsObserver(this, new SmsResponseCallback() {
@Override
public void onCallbackSmsContent(String smsContent) {
//这里接收短信
}
}, new VerificationCodeSmsFilter("180"));
```
### 注册短信变化监听器
* 在注册监听器以后,短信观察者就已经启动短信变化监听,接下只要接收短信,对短信做处理就可以了
```java
/***
* 注册短信变化观察者
*
* @see [类、类#方法、类#成员]
*/
smsObserver.registerSMSObserver();
```
### 注销短信变化监听器
* 在不需要再使用短信接收功能的时候,请注销短信监听器,不然后续还是可以接收得到短信
```java
/***
* 注销短信变化观察者
*
* @see [类、类#方法、类#成员]
*/
smsObserver.unregisterSMSObserver();
```
### 短信过滤器
* 要接收到自己想要的短信内容只要实现自己的SmsFilter短信过滤器即可
```java
/**
* 短信验证码过滤器
*
* @author 江钰锋 00501
* @version [版本号, 16/6/2]
* @see [相关类/方法]
* @since [产品/模块版本]
*/
public class VerificationCodeSmsFilter implements SmsFilter {
/**
* 需要过滤的发短信的人
*/
private String filterAddress;
public VerificationCodeSmsFilter(String filterAddress) {
this.filterAddress = filterAddress;
}
@Override
public String filter(String address, String smsContent) {
if (address.startsWith(filterAddress)) {
Pattern pattern = Pattern.compile("(\\d{4,8})");//匹配4-8位的数字
Matcher matcher = pattern.matcher(smsContent);
if (matcher.find()) {
return matcher.group(0);
}
}
return null;
}
}
```
# 关于作者Robin
* 屌丝程序员
* GitHub: [Robin-jiangyufeng](https://github.com/Robin-jiangyufeng)
* QQ:429257411
* 交流QQ群 236395044
================================================
FILE: Sample/.gitignore
================================================
/build
================================================
FILE: Sample/build.gradle
================================================
apply plugin: 'com.android.application'
android {
compileSdkVersion 27
buildToolsVersion "28.0.3"
defaultConfig {
applicationId "com.robin.lazy.sample"
minSdkVersion 14
targetSdkVersion 27
versionCode 1
versionName "1.0"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
}
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation 'com.karumi:dexter:5.0.0'
testImplementation 'junit:junit:4.12'
implementation 'com.android.support:appcompat-v7:27.1.1'
implementation project(':SmsObserverLibrary')
}
================================================
FILE: Sample/proguard-rules.pro
================================================
# Add project specific ProGuard rules here.
# By default, the flags in this file are appended to flags specified
# in /Volumes/Work/androidIDE/sdk/tools/proguard/proguard-android.txt
# You can edit the include path and order by changing the proguardFiles
# directive in build.gradle.
#
# For more details, see
# http://developer.android.com/guide/developing/tools/proguard.html
# Add any project specific keep options here:
# If your project uses WebView with JS, uncomment the following
# and specify the fully qualified class name to the JavaScript interface
# class:
#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
# public *;
#}
================================================
FILE: Sample/src/androidTest/java/com/robin/lazy/sample/ApplicationTest.java
================================================
package com.robin.lazy.sample;
import android.app.Application;
import android.test.ApplicationTestCase;
/**
* Testing Fundamentals
*/
public class ApplicationTest extends ApplicationTestCase {
public ApplicationTest() {
super(Application.class);
}
}
================================================
FILE: Sample/src/main/AndroidManifest.xml
================================================
================================================
FILE: Sample/src/main/java/com/robin/lazy/sample/App.java
================================================
/**
* 文 件 名: App.java
* 版 权: Technologies Co., Ltd. Copyright YYYY-YYYY, All rights reserved
* 描 述: <描述>
* 修 改 人: 江钰锋 00501
* 修改时间: 16/6/8
* 跟踪单号: <跟踪单号>
* 修改单号: <修改单号>
* 修改内容: <修改内容>
*/
package com.robin.lazy.sample;
import android.app.Application;
/**
* <一句话功能简述>
*
* @author 江钰锋 00501
* @version [版本号, 16/6/8]
* @see [相关类/方法]
* @since [产品/模块版本]
*/
public class App extends Application{
@Override
public void onCreate() {
super.onCreate();
}
}
================================================
FILE: Sample/src/main/java/com/robin/lazy/sample/MainActivity.java
================================================
package com.robin.lazy.sample;
import android.Manifest;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.widget.TextView;
import com.karumi.dexter.Dexter;
import com.karumi.dexter.PermissionToken;
import com.karumi.dexter.listener.PermissionDeniedResponse;
import com.karumi.dexter.listener.PermissionGrantedResponse;
import com.karumi.dexter.listener.PermissionRequest;
import com.karumi.dexter.listener.single.PermissionListener;
import com.robin.lazy.sms.SmsObserver;
import com.robin.lazy.sms.SmsResponseCallback;
import com.robin.lazy.sms.VerificationCodeSmsFilter;
public class MainActivity extends AppCompatActivity implements SmsResponseCallback{
private TextView textView;
private SmsObserver smsObserver;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
smsObserver=new SmsObserver(this,this,new VerificationCodeSmsFilter("180"));
smsObserver.registerSMSObserver();
textView=(TextView)findViewById(R.id.textView);
Dexter.withActivity(this)
.withPermission(Manifest.permission.READ_SMS)
.withListener(new PermissionListener() {
@Override public void onPermissionGranted(PermissionGrantedResponse response) {/* ... */}
@Override public void onPermissionDenied(PermissionDeniedResponse response) {/* ... */}
@Override public void onPermissionRationaleShouldBeShown(PermissionRequest permission, PermissionToken token) {/* ... */}
}).check();
}
@Override
public void onCallbackSmsContent(String code) {
textView.setText("短信验证码:"+code);
}
@Override
protected void onDestroy() {
super.onDestroy();
smsObserver.unregisterSMSObserver();
}
}
================================================
FILE: Sample/src/main/res/layout/activity_main.xml
================================================
================================================
FILE: Sample/src/main/res/values/colors.xml
================================================
#3F51B5
#303F9F
#FF4081
================================================
FILE: Sample/src/main/res/values/dimens.xml
================================================
16dp
16dp
================================================
FILE: Sample/src/main/res/values/strings.xml
================================================
SmsObserverForAndroid
================================================
FILE: Sample/src/main/res/values/styles.xml
================================================
================================================
FILE: Sample/src/main/res/values-w820dp/dimens.xml
================================================
64dp
================================================
FILE: Sample/src/test/java/com/robin/lazy/sms/ExampleUnitTest.java
================================================
package com.robin.lazy.sample;
import org.junit.Test;
import static org.junit.Assert.*;
/**
* To work on unit tests, switch the Test Artifact in the Build Variants view.
*/
public class ExampleUnitTest {
@Test
public void addition_isCorrect() throws Exception {
assertEquals(4, 2 + 2);
}
}
================================================
FILE: SmsObserverLibrary/.gitignore
================================================
/build
================================================
FILE: SmsObserverLibrary/build.gradle
================================================
apply plugin: 'com.android.library'
android {
compileSdkVersion 27
buildToolsVersion "28.0.3"
defaultConfig {
minSdkVersion 14
targetSdkVersion 27
versionCode 1
versionName "1.0"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
}
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
testImplementation 'junit:junit:4.12'
}
================================================
FILE: SmsObserverLibrary/proguard-rules.pro
================================================
# Add project specific ProGuard rules here.
# By default, the flags in this file are appended to flags specified
# in /Volumes/Work/androidIDE/sdk/tools/proguard/proguard-android.txt
# You can edit the include path and order by changing the proguardFiles
# directive in build.gradle.
#
# For more details, see
# http://developer.android.com/guide/developing/tools/proguard.html
# Add any project specific keep options here:
# If your project uses WebView with JS, uncomment the following
# and specify the fully qualified class name to the JavaScript interface
# class:
#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
# public *;
#}
================================================
FILE: SmsObserverLibrary/src/androidTest/java/com/robin/lazy/sample/ApplicationTest.java
================================================
package com.robin.lazy.sample;
import android.app.Application;
import android.test.ApplicationTestCase;
/**
* Testing Fundamentals
*/
public class ApplicationTest extends ApplicationTestCase {
public ApplicationTest() {
super(Application.class);
}
}
================================================
FILE: SmsObserverLibrary/src/main/AndroidManifest.xml
================================================
================================================
FILE: SmsObserverLibrary/src/main/java/com/robin/lazy/sms/DefaultSmsFilter.java
================================================
/*
* 文 件 名: DefaultSmsFilter.java
* 版 权: Technologies Co., Ltd. Copyright YYYY-YYYY, All rights reserved
* 描 述: <描述>
* 修 改 人: 江钰锋 00501
* 修改时间: 16/6/2
* 跟踪单号: <跟踪单号>
* 修改单号: <修改单号>
* 修改内容: <修改内容>
*/
package com.robin.lazy.sms;
/**
* 默认的短信过滤器
*
* @author 江钰锋 00501
* @version [版本号, 16/6/2]
* @see [相关类/方法]
* @since [产品/模块版本]
*/
public class DefaultSmsFilter implements SmsFilter{
@Override
public String filter(String address, String smsContent) {
return smsContent;
}
}
================================================
FILE: SmsObserverLibrary/src/main/java/com/robin/lazy/sms/SmsFilter.java
================================================
/*
* 文 件 名: SmsFilter.java
* 版 权: Technologies Co., Ltd. Copyright YYYY-YYYY, All rights reserved
* 描 述: <描述>
* 修 改 人: 江钰锋 00501
* 修改时间: 16/6/2
* 跟踪单号: <跟踪单号>
* 修改单号: <修改单号>
* 修改内容: <修改内容>
*/
package com.robin.lazy.sms;
/**
* 短信过滤器
*
* @author 江钰锋 00501
* @version [版本号, 16/6/2]
* @see [相关类/方法]
* @since [产品/模块版本]
*/
public interface SmsFilter {
/***
* 过滤方法
* @param address 发信人
* @param smsContent 短信内容
* @return 过滤处理后的短信信息
*/
String filter(String address,String smsContent);
}
================================================
FILE: SmsObserverLibrary/src/main/java/com/robin/lazy/sms/SmsHandler.java
================================================
package com.robin.lazy.sms;
import android.os.Handler;
import android.os.Message;
/**
* 短信处理
*
* @author 江钰锋 0152
* @version [版本号, 2015年9月17日]
* @see [相关类/方法]
* @since [产品/模块版本]
*/
public class SmsHandler extends Handler {
private SmsResponseCallback mCallback;
/***
* 短信过滤器
*/
private SmsFilter smsFilter;
public SmsHandler(SmsResponseCallback callback) {
this.mCallback = callback;
}
public SmsHandler(SmsResponseCallback callback, SmsFilter smsFilter) {
this(callback);
this.smsFilter = smsFilter;
}
/***
* 设置短信过滤器
* @param smsFilter 短信过滤器
*/
public void setSmsFilter(SmsFilter smsFilter) {
this.smsFilter = smsFilter;
}
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
if (msg.what == SmsObserver.MSG_RECEIVED_CODE) {
String[] smsInfos = (String[]) msg.obj;
if (smsInfos != null && smsInfos.length == 2 && mCallback != null) {
if (smsFilter == null) {
smsFilter = new DefaultSmsFilter();
}
mCallback.onCallbackSmsContent(smsFilter.filter(smsInfos[0], smsInfos[1]));
}
}
}
}
================================================
FILE: SmsObserverLibrary/src/main/java/com/robin/lazy/sms/SmsObserver.java
================================================
package com.robin.lazy.sms;
import android.app.Activity;
import android.content.Context;
import android.database.ContentObserver;
import android.database.Cursor;
import android.net.Uri;
import android.util.Log;
/***
* 短信接收观察者
*
* @author 江钰锋 0152
* @version [版本号, 2015年9月17日]
* @see [相关类/方法]
* @since [产品/模块版本]
*/
public class SmsObserver extends ContentObserver {
private Context mContext;
public static final int MSG_RECEIVED_CODE = 1001;
private SmsHandler mHandler;
/***
* 构造器
* @param context
* @param callback 短信接收器
* @param smsFilter 短信过滤器
*/
public SmsObserver(Activity context, SmsResponseCallback callback,SmsFilter smsFilter) {
this(new SmsHandler(callback,smsFilter));
this.mContext = context;
}
public SmsObserver(Activity context, SmsResponseCallback callback) {
this(new SmsHandler(callback));
this.mContext = context;
}
public SmsObserver(SmsHandler handler) {
super(handler);
this.mHandler = handler;
}
/***
* 设置短信过滤器
* @param smsFilter
*/
public void setSmsFilter(SmsFilter smsFilter) {
mHandler.setSmsFilter(smsFilter);
}
/***
* 注册短信变化观察者
*
* @see [类、类#方法、类#成员]
*/
public void registerSMSObserver() {
Uri uri = Uri.parse("content://sms");
if (mContext != null) {
mContext.getContentResolver().registerContentObserver(uri,
true, this);
}
}
/***
* 注销短信变化观察者
*
* @see [类、类#方法、类#成员]
*/
public void unregisterSMSObserver() {
if (mContext != null) {
mContext.getContentResolver().unregisterContentObserver(this);
}
if (mHandler != null) {
mHandler = null;
}
}
@Override
public void onChange(boolean selfChange, Uri uri) {
super.onChange(selfChange, uri);
if (uri.toString().equals("content://sms/raw")) {
return;
}
Uri inboxUri = Uri.parse("content://sms/inbox");//收件箱
try {
Cursor c = mContext.getContentResolver().query(inboxUri, null, null,
null, "date desc");
if (c != null) {
if (c.moveToFirst()) {
String address = c.getString(c.getColumnIndex("address"));
String body = c.getString(c.getColumnIndex("body"));
if (mHandler != null) {
mHandler.obtainMessage(MSG_RECEIVED_CODE, new String[]{address, body})
.sendToTarget();
}
Log.i(getClass().getName(), "发件人为:" + address + " " + "短信内容为:" + body);
}
c.close();
}
} catch (SecurityException e) {
Log.e(getClass().getName(), "获取短信权限失败", e);
} catch (Exception e) {
e.printStackTrace();
}
}
}
================================================
FILE: SmsObserverLibrary/src/main/java/com/robin/lazy/sms/SmsResponseCallback.java
================================================
package com.robin.lazy.sms;
/**
* 短信接收器回调接口
*
* @author 江钰锋 0152
* @version [版本号, 2015年9月17日]
* @see [相关类/方法]
* @since [产品/模块版本]
*/
public interface SmsResponseCallback {
/**
* 返回短信内容
*
* @param smsContent
* @see [类、类#方法、类#成员]
*/
void onCallbackSmsContent(String smsContent);
}
================================================
FILE: SmsObserverLibrary/src/main/java/com/robin/lazy/sms/VerificationCodeSmsFilter.java
================================================
/*
* 文 件 名: CerificationCode.java
* 版 权: Technologies Co., Ltd. Copyright YYYY-YYYY, All rights reserved
* 描 述: <描述>
* 修 改 人: 江钰锋 00501
* 修改时间: 16/6/2
* 跟踪单号: <跟踪单号>
* 修改单号: <修改单号>
* 修改内容: <修改内容>
*/
package com.robin.lazy.sms;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/**
* 短信验证码过滤器
*
* @author 江钰锋 00501
* @version [版本号, 16/6/2]
* @see [相关类/方法]
* @since [产品/模块版本]
*/
public class VerificationCodeSmsFilter implements SmsFilter {
/**
* 需要过滤的发短信的人
*/
private String filterAddress;
public VerificationCodeSmsFilter(String filterAddress) {
this.filterAddress = filterAddress;
}
@Override
public String filter(String address, String smsContent) {
if (address.startsWith(filterAddress)) {
Pattern pattern = Pattern.compile("(\\d{4,8})");//匹配4-8位的数字
Matcher matcher = pattern.matcher(smsContent);
if (matcher.find()) {
return matcher.group(0);
}
}
return null;
}
}
================================================
FILE: SmsObserverLibrary/src/main/res/values/strings.xml
================================================
SmsObserverLibrary
================================================
FILE: SmsObserverLibrary/src/test/java/com/robin/lazy/sms/ExampleUnitTest.java
================================================
package com.robin.lazy.sample;
import org.junit.Test;
import static org.junit.Assert.*;
/**
* To work on unit tests, switch the Test Artifact in the Build Variants view.
*/
public class ExampleUnitTest {
@Test
public void addition_isCorrect() throws Exception {
assertEquals(4, 2 + 2);
}
}
================================================
FILE: build.gradle
================================================
// Top-level build file where you can add configuration options common to all sub-projects/modules.
buildscript {
repositories {
mavenCentral()
maven {
url 'http://maven.aliyun.com/nexus/content/groups/public/'
}
jcenter()
google()
}
dependencies {
classpath 'com.android.tools.build:gradle:3.4.1'
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
}
}
allprojects {
repositories {
maven { url 'http://maven.aliyun.com/nexus/content/groups/public/' }
maven { url "https://jitpack.io" }
jcenter()
google()
}
}
task clean(type: Delete) {
delete rootProject.buildDir
}
================================================
FILE: gradle.properties
================================================
# Project-wide Gradle settings.
# IDE (e.g. Android Studio) users:
# Gradle settings configured through the IDE *will override*
# any settings specified in this file.
# For more details on how to configure your build environment visit
# http://www.gradle.org/docs/current/userguide/build_environment.html
# Specifies the JVM arguments used for the daemon process.
# The setting is particularly useful for tweaking memory settings.
# Default value: -Xmx10248m -XX:MaxPermSize=256m
# org.gradle.jvmargs=-Xmx2048m -XX:MaxPermSize=512m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8
# When configured, Gradle will run in incubating parallel mode.
# This option should only be used with decoupled projects. More details, visit
# http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects
# org.gradle.parallel=true
================================================
FILE: settings.gradle
================================================
include ':Sample', ':SmsObserverLibrary'