安卓获取短信验证码和RN使用

小米手机需手动开启通知类短信权限,权限管理-通知类短信
小米手机需手动开启通知类短信权限,权限管理-通知类短信

小米手机需手动开启通知类短信权限,权限管理-通知类短信
 

创建短信监听 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发生改变时,就会回调此方法
     * <p>
     * 注意当收到短信的时候会回调两次
     * 收到短信一般来说都是执行了两次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<NativeModule> createNativeModules(@Nonnull ReactApplicationContext reactContext) {
//reactContext 全局调用
        EventEmitter.mReactContext=reactContext;
        List<NativeModule> modules = new ArrayList<>();
        modules.add(new RnModule(reactContext)); // 将新建的 MyModule 实例加入到 List 中完成注册
        return modules;
    }

    @Nonnull
    @Override
    public List<ViewManager> 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<ReactPackage> getPackages() {
          @SuppressWarnings("UnnecessaryLocalVariable")
          List<ReactPackage> 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);
    });

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值