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