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'