You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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,核心实现逻辑如下:
    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");
            }
        }
    }
    
    按React Native原生模块注册规则,将该模块添加到自定义Package中,并在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.11 18:00:04