├── .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 | --------------------------------------------------------------------------------