master a73ba1a92df0 cached
32 files
19.7 KB
6.6k tokens
36 symbols
1 requests
Download .txt
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
    <uses-permission android:name="android.permission.RECEIVE_SMS" />
    <uses-permission android:name="android.permission.READ_SMS" />
```
### 初始化
```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;

/**
 * <a href="http://d.android.com/tools/testing/testing_android.html">Testing Fundamentals</a>
 */
public class ApplicationTest extends ApplicationTestCase<Application> {
    public ApplicationTest() {
        super(Application.class);
    }
}

================================================
FILE: Sample/src/main/AndroidManifest.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.robin.lazy.sample">

    <uses-permission android:name="android.permission.RECEIVE_SMS" />
    <uses-permission android:name="android.permission.READ_SMS" />

    <application
        android:name=".App"
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name="com.robin.lazy.sample.MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>


================================================
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
================================================
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context="com.robin.lazy.sample.MainActivity">

    <TextView
        android:id="@+id/textView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Hello World!" />
</RelativeLayout>


================================================
FILE: Sample/src/main/res/values/colors.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<resources>
    <color name="colorPrimary">#3F51B5</color>
    <color name="colorPrimaryDark">#303F9F</color>
    <color name="colorAccent">#FF4081</color>
</resources>


================================================
FILE: Sample/src/main/res/values/dimens.xml
================================================
<resources>
    <!-- Default screen margins, per the Android Design guidelines. -->
    <dimen name="activity_horizontal_margin">16dp</dimen>
    <dimen name="activity_vertical_margin">16dp</dimen>
</resources>


================================================
FILE: Sample/src/main/res/values/strings.xml
================================================
<resources>
    <string name="app_name">SmsObserverForAndroid</string>
</resources>


================================================
FILE: Sample/src/main/res/values/styles.xml
================================================
<resources>

    <!-- Base application theme. -->
    <style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
        <!-- Customize your theme here. -->
        <item name="colorPrimary">@color/colorPrimary</item>
        <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
        <item name="colorAccent">@color/colorAccent</item>
    </style>

</resources>


================================================
FILE: Sample/src/main/res/values-w820dp/dimens.xml
================================================
<resources>
    <!-- Example customization of dimensions originally defined in res/values/dimens.xml
         (such as screen margins) for screens with more than 820dp of available width. This
         would include 7" and 10" devices in landscape (~960dp and ~1280dp respectively). -->
    <dimen name="activity_horizontal_margin">64dp</dimen>
</resources>


================================================
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;

/**
 * <a href="http://d.android.com/tools/testing/testing_android.html">Testing Fundamentals</a>
 */
public class ApplicationTest extends ApplicationTestCase<Application> {
    public ApplicationTest() {
        super(Application.class);
    }
}

================================================
FILE: SmsObserverLibrary/src/main/AndroidManifest.xml
================================================
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.robin.lazy.sms">

    <application
        android:allowBackup="true"
        android:label="@string/app_name"
        android:supportsRtl="true">

    </application>

</manifest>


================================================
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
================================================
<resources>
    <string name="app_name">SmsObserverLibrary</string>
</resources>


================================================
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'
Download .txt
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
Download .txt
SYMBOL INDEX (36 symbols across 12 files)

FILE: Sample/src/androidTest/java/com/robin/lazy/sample/ApplicationTest.java
  class ApplicationTest (line 9) | public class ApplicationTest extends ApplicationTestCase<Application> {
    method ApplicationTest (line 10) | public ApplicationTest() {

FILE: Sample/src/main/java/com/robin/lazy/sample/App.java
  class App (line 24) | public class App extends Application{
    method onCreate (line 25) | @Override

FILE: Sample/src/main/java/com/robin/lazy/sample/MainActivity.java
  class MainActivity (line 18) | public class MainActivity extends AppCompatActivity implements SmsRespon...
    method onCreate (line 22) | @Override
    method onCallbackSmsContent (line 38) | @Override
    method onDestroy (line 43) | @Override

FILE: Sample/src/test/java/com/robin/lazy/sms/ExampleUnitTest.java
  class ExampleUnitTest (line 10) | public class ExampleUnitTest {
    method addition_isCorrect (line 11) | @Test

FILE: SmsObserverLibrary/src/androidTest/java/com/robin/lazy/sample/ApplicationTest.java
  class ApplicationTest (line 9) | public class ApplicationTest extends ApplicationTestCase<Application> {
    method ApplicationTest (line 10) | public ApplicationTest() {

FILE: SmsObserverLibrary/src/main/java/com/robin/lazy/sms/DefaultSmsFilter.java
  class DefaultSmsFilter (line 22) | public class DefaultSmsFilter implements SmsFilter{
    method filter (line 24) | @Override

FILE: SmsObserverLibrary/src/main/java/com/robin/lazy/sms/SmsFilter.java
  type SmsFilter (line 22) | public interface SmsFilter {
    method filter (line 30) | String filter(String address,String smsContent);

FILE: SmsObserverLibrary/src/main/java/com/robin/lazy/sms/SmsHandler.java
  class SmsHandler (line 14) | public class SmsHandler extends Handler {
    method SmsHandler (line 23) | public SmsHandler(SmsResponseCallback callback) {
    method SmsHandler (line 27) | public SmsHandler(SmsResponseCallback callback, SmsFilter smsFilter) {
    method setSmsFilter (line 36) | public void setSmsFilter(SmsFilter smsFilter) {
    method handleMessage (line 40) | @Override

FILE: SmsObserverLibrary/src/main/java/com/robin/lazy/sms/SmsObserver.java
  class SmsObserver (line 18) | public class SmsObserver extends ContentObserver {
    method SmsObserver (line 30) | public SmsObserver(Activity context, SmsResponseCallback callback,SmsF...
    method SmsObserver (line 35) | public SmsObserver(Activity context, SmsResponseCallback callback) {
    method SmsObserver (line 40) | public SmsObserver(SmsHandler handler) {
    method setSmsFilter (line 49) | public void setSmsFilter(SmsFilter smsFilter) {
    method registerSMSObserver (line 58) | public void registerSMSObserver() {
    method unregisterSMSObserver (line 71) | public void unregisterSMSObserver() {
    method onChange (line 80) | @Override

FILE: SmsObserverLibrary/src/main/java/com/robin/lazy/sms/SmsResponseCallback.java
  type SmsResponseCallback (line 11) | public interface SmsResponseCallback {
    method onCallbackSmsContent (line 19) | void onCallbackSmsContent(String smsContent);

FILE: SmsObserverLibrary/src/main/java/com/robin/lazy/sms/VerificationCodeSmsFilter.java
  class VerificationCodeSmsFilter (line 25) | public class VerificationCodeSmsFilter implements SmsFilter {
    method VerificationCodeSmsFilter (line 31) | public VerificationCodeSmsFilter(String filterAddress) {
    method filter (line 35) | @Override

FILE: SmsObserverLibrary/src/test/java/com/robin/lazy/sms/ExampleUnitTest.java
  class ExampleUnitTest (line 10) | public class ExampleUnitTest {
    method addition_isCorrect (line 11) | @Test
Condensed preview — 32 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (25K chars).
[
  {
    "path": ".gitignore",
    "chars": 132,
    "preview": "*.iml\n.gradle\n/local.properties\n/.idea/workspace.xml\n/.idea\n/.idea/libraries\n.DS_Store\n/build\n/captures\n/gradle\ngradlew\n"
  },
  {
    "path": "README.md",
    "chars": 2155,
    "preview": "# 项目介绍\n### 项目地址:\n   [SmsObserverForAndroid](https://github.com/Robin-jiangyufeng/SmsObserverForAndroid) \n   \n### 介绍\n   *"
  },
  {
    "path": "Sample/.gitignore",
    "chars": 7,
    "preview": "/build\n"
  },
  {
    "path": "Sample/build.gradle",
    "chars": 738,
    "preview": "apply plugin: 'com.android.application'\n\nandroid {\n    compileSdkVersion 27\n    buildToolsVersion \"28.0.3\"\n\n    defaultC"
  },
  {
    "path": "Sample/proguard-rules.pro",
    "chars": 659,
    "preview": "# Add project specific ProGuard rules here.\n# By default, the flags in this file are appended to flags specified\n# in /V"
  },
  {
    "path": "Sample/src/androidTest/java/com/robin/lazy/sample/ApplicationTest.java",
    "chars": 352,
    "preview": "package com.robin.lazy.sample;\n\nimport android.app.Application;\nimport android.test.ApplicationTestCase;\n\n/**\n * <a href"
  },
  {
    "path": "Sample/src/main/AndroidManifest.xml",
    "chars": 849,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    package="
  },
  {
    "path": "Sample/src/main/java/com/robin/lazy/sample/App.java",
    "chars": 500,
    "preview": "/**\n * 文 件 名:  App.java\n * 版    权:  Technologies Co., Ltd. Copyright YYYY-YYYY,  All rights reserved\n * 描    述:  <描述>\n *"
  },
  {
    "path": "Sample/src/main/java/com/robin/lazy/sample/MainActivity.java",
    "chars": 1904,
    "preview": "package com.robin.lazy.sample;\n\nimport android.Manifest;\nimport android.os.Bundle;\nimport android.support.v7.app.AppComp"
  },
  {
    "path": "Sample/src/main/res/layout/activity_main.xml",
    "chars": 736,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<RelativeLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xm"
  },
  {
    "path": "Sample/src/main/res/values/colors.xml",
    "chars": 208,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <color name=\"colorPrimary\">#3F51B5</color>\n    <color name=\"color"
  },
  {
    "path": "Sample/src/main/res/values/dimens.xml",
    "chars": 211,
    "preview": "<resources>\n    <!-- Default screen margins, per the Android Design guidelines. -->\n    <dimen name=\"activity_horizontal"
  },
  {
    "path": "Sample/src/main/res/values/strings.xml",
    "chars": 84,
    "preview": "<resources>\n    <string name=\"app_name\">SmsObserverForAndroid</string>\n</resources>\n"
  },
  {
    "path": "Sample/src/main/res/values/styles.xml",
    "chars": 383,
    "preview": "<resources>\n\n    <!-- Base application theme. -->\n    <style name=\"AppTheme\" parent=\"Theme.AppCompat.Light.DarkActionBar"
  },
  {
    "path": "Sample/src/main/res/values-w820dp/dimens.xml",
    "chars": 358,
    "preview": "<resources>\n    <!-- Example customization of dimensions originally defined in res/values/dimens.xml\n         (such as s"
  },
  {
    "path": "Sample/src/test/java/com/robin/lazy/sms/ExampleUnitTest.java",
    "chars": 314,
    "preview": "package com.robin.lazy.sample;\n\nimport org.junit.Test;\n\nimport static org.junit.Assert.*;\n\n/**\n * To work on unit tests,"
  },
  {
    "path": "SmsObserverLibrary/.gitignore",
    "chars": 7,
    "preview": "/build\n"
  },
  {
    "path": "SmsObserverLibrary/build.gradle",
    "chars": 532,
    "preview": "apply plugin: 'com.android.library'\n\nandroid {\n    compileSdkVersion 27\n    buildToolsVersion \"28.0.3\"\n\n    defaultConfi"
  },
  {
    "path": "SmsObserverLibrary/proguard-rules.pro",
    "chars": 659,
    "preview": "# Add project specific ProGuard rules here.\n# By default, the flags in this file are appended to flags specified\n# in /V"
  },
  {
    "path": "SmsObserverLibrary/src/androidTest/java/com/robin/lazy/sample/ApplicationTest.java",
    "chars": 352,
    "preview": "package com.robin.lazy.sample;\n\nimport android.app.Application;\nimport android.test.ApplicationTestCase;\n\n/**\n * <a href"
  },
  {
    "path": "SmsObserverLibrary/src/main/AndroidManifest.xml",
    "chars": 266,
    "preview": "<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    package=\"com.robin.lazy.sms\">\n\n    <application"
  },
  {
    "path": "SmsObserverLibrary/src/main/java/com/robin/lazy/sms/DefaultSmsFilter.java",
    "chars": 524,
    "preview": "/*\n * 文 件 名:  DefaultSmsFilter.java\n * 版    权:  Technologies Co., Ltd. Copyright YYYY-YYYY,  All rights reserved\n * 描   "
  },
  {
    "path": "SmsObserverLibrary/src/main/java/com/robin/lazy/sms/SmsFilter.java",
    "chars": 546,
    "preview": "/*\n * 文 件 名:  SmsFilter.java\n * 版    权:  Technologies Co., Ltd. Copyright YYYY-YYYY,  All rights reserved\n * 描    述:  <描"
  },
  {
    "path": "SmsObserverLibrary/src/main/java/com/robin/lazy/sms/SmsHandler.java",
    "chars": 1258,
    "preview": "package com.robin.lazy.sms;\n\nimport android.os.Handler;\nimport android.os.Message;\n\n/**\n * 短信处理\n *\n * @author 江钰锋 0152\n "
  },
  {
    "path": "SmsObserverLibrary/src/main/java/com/robin/lazy/sms/SmsObserver.java",
    "chars": 2971,
    "preview": "package com.robin.lazy.sms;\n\nimport android.app.Activity;\nimport android.content.Context;\nimport android.database.Conten"
  },
  {
    "path": "SmsObserverLibrary/src/main/java/com/robin/lazy/sms/SmsResponseCallback.java",
    "chars": 306,
    "preview": "package com.robin.lazy.sms;\n\n/**\n * 短信接收器回调接口\n * \n * @author  江钰锋 0152\n * @version  [版本号, 2015年9月17日]\n * @see  [相关类/方法]\n"
  },
  {
    "path": "SmsObserverLibrary/src/main/java/com/robin/lazy/sms/VerificationCodeSmsFilter.java",
    "chars": 1052,
    "preview": "/*\n * 文 件 名:  CerificationCode.java\n * 版    权:  Technologies Co., Ltd. Copyright YYYY-YYYY,  All rights reserved\n * 描   "
  },
  {
    "path": "SmsObserverLibrary/src/main/res/values/strings.xml",
    "chars": 81,
    "preview": "<resources>\n    <string name=\"app_name\">SmsObserverLibrary</string>\n</resources>\n"
  },
  {
    "path": "SmsObserverLibrary/src/test/java/com/robin/lazy/sms/ExampleUnitTest.java",
    "chars": 314,
    "preview": "package com.robin.lazy.sample;\n\nimport org.junit.Test;\n\nimport static org.junit.Assert.*;\n\n/**\n * To work on unit tests,"
  },
  {
    "path": "build.gradle",
    "chars": 772,
    "preview": "// Top-level build file where you can add configuration options common to all sub-projects/modules.\n\nbuildscript {\n    r"
  },
  {
    "path": "gradle.properties",
    "chars": 855,
    "preview": "# Project-wide Gradle settings.\n\n# IDE (e.g. Android Studio) users:\n# Gradle settings configured through the IDE *will o"
  },
  {
    "path": "settings.gradle",
    "chars": 41,
    "preview": "include ':Sample', ':SmsObserverLibrary'\n"
  }
]

About this extraction

This page contains the full source code of the Robin-jiangyufeng/SmsObserverForAndroid GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 32 files (19.7 KB), approximately 6.6k tokens, and a symbol index with 36 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.

Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.

Copied to clipboard!