React Native(Android)如何检测手机GSM信号及获取ServiceState
React Native GSM ServiceState 检测方案
现有第三方包适配情况
你测试过的react-native-community/netinfo、expo-signal、react-native-device-info、react-native-carrier-info均不支持直接读取安卓原生ServiceState字段,原因是这些包的网络检测逻辑仅覆盖数据网络状态,和GSM语音/短信服务的注册状态独立,因此会出现数据网络返回null但仍可正常发送短信的情况。
目前没有开箱即用的第三方包支持该需求,需要自行封装安卓原生模块实现。
最简实现方案(仅安卓可实现,iOS无公开API支持同等能力)
实现仅需3步,总代码量不到100行:
- 第一步:添加权限
在安卓项目的AndroidManifest.xml中添加2项必要权限:<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <uses-permission android:name="android.permission.READ_PHONE_STATE" /> - 第二步:创建安卓原生模块
新建ServiceStateModule.java类继承ReactContextBaseJavaModule,核心实现逻辑如下:
按React Native原生模块注册规则,将该模块添加到自定义Package中,并在package com.yourpackage; import com.facebook.react.bridge.Arguments; import com.facebook.react.bridge.Promise; import com.facebook.react.bridge.ReactApplicationContext; import com.facebook.react.bridge.ReactContextBaseJavaModule; import com.facebook.react.bridge.ReactMethod; import com.facebook.react.bridge.WritableMap; import android.telephony.ServiceState; import android.telephony.TelephonyManager; import android.content.Context; import android.os.Build; public class ServiceStateModule extends ReactContextBaseJavaModule { public ServiceStateModule(ReactApplicationContext context) { super(context); } @Override public String getName() { return "ServiceStateModule"; } @ReactMethod public void getServiceState(Promise promise) { TelephonyManager tm = (TelephonyManager) getReactApplicationContext().getSystemService(Context.TELEPHONY_SERVICE); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) { ServiceState state = tm.getServiceState(); WritableMap result = Arguments.createMap(); // 可根据需求扩展返回更多ServiceState字段 result.putBoolean("isInService", state.getState() == ServiceState.STATE_IN_SERVICE); result.putInt("voiceRegisterState", state.getVoiceRegState()); result.putInt("dataRegisterState", state.getDataRegState()); result.putBoolean("isGsm", state.getRilRadioTechnology() == ServiceState.RIL_RADIO_TECHNOLOGY_GSM); promise.resolve(result); } else { // 兼容Android 11以下版本可通过PhoneStateListener监听ServiceState变化缓存状态后返回 promise.reject("LOW_SYSTEM_VERSION", "仅支持Android 11及以上版本直接读取ServiceState"); } } }MainApplication的getPackages方法里注册Package即可。 - 第三步:封装JS调用接口
在JS侧封装调用方法即可直接使用:import { NativeModules, PermissionsAndroid } from 'react-native'; export const getGsmServiceState = async () => { // 先请求READ_PHONE_STATE权限 const granted = await PermissionsAndroid.request( PermissionsAndroid.PERMISSIONS.READ_PHONE_STATE ); if (granted !== PermissionsAndroid.RESULTS.GRANTED) { throw new Error('无电话权限无法读取服务状态'); } return await NativeModules.ServiceStateModule.getServiceState(); }
内容的提问来源于stack exchange,提问作者Mauro Elias
相关产品推荐
相关产品推荐

