小米手机需手动开启通知类短信权限,权限管理-通知类短信
小米手机需手动开启通知类短信权限,权限管理-通知类短信
小米手机需手动开启通知类短信权限,权限管理-通知类短信
创建短信监听 RnModule.java
package com.getsms;
import android.annotation.SuppressLint;
import android.content.Context;
import android.database.ContentObserver;
import android.database.Cursor;
import android.net.Uri;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
public class SMSContentObserver extends ContentObserver {
private Context mContext; // 上下文
private Handler mHandler; // 更新UI线程
private String code; // 验证码
private Uri mUri;
public SMSContentObserver(MainApplication context, Handler handler) {
super(handler);
mContext = context;
mHandler = handler;
}
/**
* 回调函数, 当所监听的Uri发生改变时,就会回调此方法
*
* 注意当收到短信的时候会回调两次
* 收到短信一般来说都是执行了两次onchange方法.第一次一般都是raw的这个.
* 这个时候虽然收到了短信.但是短信还没有写入到收件箱里面
* 然后才是另外一个,后面的数字是该短信在收件箱中的位置
*
* @param selfChange 此值意义不大 一般情况下该回调值false
*/
@Override
public void onChange(boolean selfChange, Uri uri) {
Log.e("返回的uri", uri.toString());
// 第一次回调 不是我们想要的 直接返回
if (uri.toString().equals("content://sms/raw")) {
return;
}
// 第二次回调 查询收件箱里的内容
Uri inboxUri = Uri.parse("content://sms/inbox");
if (uri == null) {
mUri = Uri.parse("content://sms/inbox");
} else {
mUri = uri;
}
// 按时间顺序排序短信数据库
Cursor c = mContext.getContentResolver().query(inboxUri, null, null,
null, "date desc");
if (c != null) {
if (c.moveToFirst()) {
// 获取短信提供商的手机号
@SuppressLint("Range") String address = c.getString(c.getColumnIndex("address"));
// 获取短信内容
@SuppressLint("Range") String body = c.getString(c.getColumnIndex("body"));
Log.i("tag", "body------->" + body);
// 判断手机号是否为目标号码(短信提供商的号码)
// 在这里我们的短信提供商的号码如果是固定的话.我们可以再加一个判断,这样就不会受到别的短信应用的验证码的影响了
// 不然的话就在我们的正则表达式中,加一些自己的判断,例如短信中含有自己应用名字啊什么的...
/*if (!address.equals("13342290623"))
{
Log.i("tag","------->没有读取到内容");
return;
}*/
// 正则表达式截取短信中的6位验证码 body 中存储的就是短信的内容 根据业务需求自己 截取需要的内容
// 利用handler将得到的验证码发送给主线程
Message msg = Message.obtain();
msg.obj = body;
mHandler.sendMessage(msg);
}
c.close();
}
}
}
MainApplication.java
private SMSContentObserver smsContentObserver;
@SuppressLint("HandlerLeak")
public static Handler handler = new Handler() {
@Override
public void handleMessage(Message msg) {
Log.e("短信内容:",msg.obj.toString());
EventEmitter.sendEvent("msgcode",msg.obj.toString());
}
};
@Override
public void onCreate() {
。。。
//ContentObserver注册
smsContentObserver = new SMSContentObserver(
MainApplication.this, handler);
getContentResolver().registerContentObserver(
Uri.parse("content://sms/"), true, smsContentObserver);
。。。
}
以下是RN-android操作步骤
RnModule.java
package com.getsms;
import android.annotation.SuppressLint;
import android.net.Uri;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import com.facebook.react.modules.core.DeviceEventManagerModule.RCTDeviceEventEmitter;
import com.facebook.react.bridge.Promise;
import com.facebook.react.bridge.ReactApplicationContext;
import com.facebook.react.bridge.ReactContext;
import com.facebook.react.bridge.ReactContextBaseJavaModule;
import com.facebook.react.bridge.ReactMethod;
import com.facebook.react.bridge.WritableMap;
import com.facebook.react.modules.core.DeviceEventManagerModule;
import com.facebook.react.uimanager.IllegalViewOperationException;
import javax.annotation.Nonnull;
public class RnModule extends ReactContextBaseJavaModule {
private Promise mPromise;
private ReactContext mReactContext;
public RnModule(@Nonnull ReactApplicationContext reactContext) {
super(reactContext);
this.mReactContext = reactContext;
}
@NonNull
@Override
public String getName() {
return "RnModule";
}
}
MyReactPackage.java
package com.getsms;
import com.facebook.react.ReactPackage;
import com.facebook.react.bridge.NativeModule;
import com.facebook.react.bridge.ReactApplicationContext;
import com.facebook.react.uimanager.ViewManager;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import javax.annotation.Nonnull;
public class MyReactPackage implements ReactPackage {
@Nonnull
@Override
public List createNativeModules(@Nonnull ReactApplicationContext reactContext) {
//reactContext 全局调用
EventEmitter.mReactContext=reactContext;
List modules = new ArrayList<>();
modules.add(new RnModule(reactContext)); // 将新建的 MyModule 实例加入到 List 中完成注册
return modules;
}
@Nonnull
@Override
public List createViewManagers(@Nonnull ReactApplicationContext reactContext) {
return Collections.emptyList();
}
}
EventEmitter.java
package com.getsms;
import com.facebook.react.bridge.ReactApplicationContext;
import com.facebook.react.modules.core.DeviceEventManagerModule;
public class EventEmitter {
static ReactApplicationContext mReactContext;
public static void sendEvent(String eventName,String param){
if(mReactContext==null){
return;
}
mReactContext.getJSModule(DeviceEventManagerModule.RCTDeviceEventEmitter.class).emit(eventName,param);
}
}
在MainApplication.java引入这个package
package com.getsms;
import android.annotation.SuppressLint;
import android.app.Application;
import android.net.Uri;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
import android.widget.EditText;
import java.util.concurrent.ThreadPoolExecutor;
import com.facebook.react.PackageList;
import com.facebook.react.ReactApplication;
import com.facebook.react.ReactNativeHost;
import com.facebook.react.ReactPackage;
import com.facebook.react.defaults.DefaultNewArchitectureEntryPoint;
import com.facebook.react.defaults.DefaultReactNativeHost;
import com.facebook.react.modules.core.DeviceEventManagerModule;
import com.facebook.soloader.SoLoader;
import java.util.List;
public class MainApplication extends Application implements ReactApplication {
private SMSContentObserver smsContentObserver;
private final ReactNativeHost mReactNativeHost =
new DefaultReactNativeHost(this) {
@Override
public boolean getUseDeveloperSupport() {
return BuildConfig.DEBUG;
}
@Override
protected List getPackages() {
@SuppressWarnings("UnnecessaryLocalVariable")
List packages = new PackageList(this).getPackages();
//引入package
packages.add(new MyReactPackage());
return packages;
}
@Override
protected String getJSMainModuleName() {
return "index";
}
@Override
protected boolean isNewArchEnabled() {
return BuildConfig.IS_NEW_ARCHITECTURE_ENABLED;
}
@Override
protected Boolean isHermesEnabled() {
return BuildConfig.IS_HERMES_ENABLED;
}
};
@Override
public ReactNativeHost getReactNativeHost() {
return mReactNativeHost;
}
@SuppressLint("HandlerLeak")
public static Handler handler = new Handler() {
@Override
public void handleMessage(Message msg) {
Log.e("短信内容:",msg.obj.toString());
//获取到短信后android给rn发送广播
EventEmitter.sendEvent("msgcode",msg.obj.toString());
}
};
@Override
public void onCreate() {
super.onCreate();
//ContentObserver注册
smsContentObserver = new SMSContentObserver(
MainApplication.this, handler);
getContentResolver().registerContentObserver(
Uri.parse("content://sms/"), true, smsContentObserver);
SoLoader.init(this, /* native exopackage */ false);
if (BuildConfig.IS_NEW_ARCHITECTURE_ENABLED) {
// If you opted-in for the New Architecture, we load the native entry point for this app.
DefaultNewArchitectureEntryPoint.load();
}
ReactNativeFlipper.initializeFlipper(this, getReactNativeHost().getReactInstanceManager());
}
}
RN-js 监听广播
DeviceEventEmitter.addListener('msgcode', e => {
console.log('接收到信息');
console.log(e);
});