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

Android 4G设备调用Telephony API获取CellSignalStrength异常咨询

问题解答

基础版本确认

  • 你的设备LND-AL30 8.0.0.203对应的系统是Android 8.0,API等级为26,并非你以为的API等级30。API30对应的是Android 11系统。

问题根因分析

配置层面错误

你当前build.gradle中minSdk 31的配置完全不符合你的设备要求:API31对应Android12系统,你的Android8.0设备根本不满足最低版本要求,这是后续所有兼容问题的核心诱因之一。

逻辑层面错误

  1. 权限申请逻辑错误:Android的动态权限申请是异步操作,你当前代码中发起权限申请后,不等用户授权就直接执行后续获取小区信息的逻辑,此时权限未生效,自然拿不到正确结果。
  2. API调用不兼容:getCellSignalStrength()方法在低版本系统上存在兼容性问题,你的Android8.0设备不支持直接从CellInfo抽象类调用该方法,所以触发崩溃。
  3. 位置服务依赖:从Android 9开始,获取基站小区信息强制要求开启设备位置服务,国内很多厂商在Android8.0版本就已经提前落地了该限制,所以关闭定位时返回空列表是正常现象。

解决方案

第一步:修正build.gradle配置

将defaultConfig下的minSdk修改为26,适配你的Android8.0设备:

defaultConfig {
    applicationId "com.example.mobilenetworkinfo"
    minSdk 26
    targetSdk 31
    versionCode 1
    versionName "1.0"
    testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
}

第二步:修正权限和位置服务判断逻辑

在执行获取小区信息前,先检查所有权限是否已授权、位置服务是否已开启,确认满足条件后再执行后续逻辑。

第三步:兼容低版本API获取信号强度

不要直接调用CellInfo的getCellSignalStrength()方法,通过类型判断对应子类后再获取信号值,示例代码如下:

int cellCount = 0;
if (tm.getAllCellInfo() != null) {
    for (CellInfo cellInfo : tm.getAllCellInfo()) {
        cellCount++;
        int dbm = 0;
        if (cellInfo instanceof CellInfoLte) {
            // 4G小区
            CellSignalStrengthLte lteSignal = ((CellInfoLte) cellInfo).getCellSignalStrength();
            dbm = lteSignal.getDbm();
        } else if (cellInfo instanceof CellInfoWcdma) {
            // 3G WCDMA小区
            CellSignalStrengthWcdma wcdmaSignal = ((CellInfoWcdma) cellInfo).getCellSignalStrength();
            dbm = wcdmaSignal.getDbm();
        } else if (cellInfo instanceof CellInfoGsm) {
            // 2G GSM小区
            CellSignalStrengthGsm gsmSignal = ((CellInfoGsm) cellInfo).getCellSignalStrength();
            dbm = gsmSignal.getDbm();
        }
        intent.putExtra("cellSignalStrength" + cellCount, dbm + "");
    }
}
intent.putExtra("CELLCOUNT", cellCount + "");

第四步:补充位置服务开启判断

可以在调用获取小区信息前,先调用以下代码判断位置服务是否开启,未开启则提示用户开启:

public static boolean isLocationEnabled(Context context) {
    LocationManager locationManager = (LocationManager) context.getSystemService(Context.LOCATION_SERVICE);
    return locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER) || locationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER);
}

按照以上步骤修改后,即可正常在你的设备上获取小区信号强度。

内容的提问来源于stack exchange,提问作者user960573

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 00:27:04