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设备根本不满足最低版本要求,这是后续所有兼容问题的核心诱因之一。
逻辑层面错误
- 权限申请逻辑错误:Android的动态权限申请是异步操作,你当前代码中发起权限申请后,不等用户授权就直接执行后续获取小区信息的逻辑,此时权限未生效,自然拿不到正确结果。
- API调用不兼容:
getCellSignalStrength()方法在低版本系统上存在兼容性问题,你的Android8.0设备不支持直接从CellInfo抽象类调用该方法,所以触发崩溃。 - 位置服务依赖:从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
相关产品推荐
相关产品推荐

