我的 Android 版本是 4.2.1,我正在尝试使用TelephonyManager.getAllCellInfo()
方法。在我的清单文件中,我拥有ACCESS_COARSE_UPDATES
, ACCESS_COARSE_LOCATION
,ACCESS_FINE_LOCATION
权限。但是该方法返回null
.
3 回答
来自TelephonyManager.getAllCellInfo()
javadoc:
这比使用 getCellLocation 更可取,尽管对于旧设备,这可能会返回 null,在这种情况下应该调用 getCellLocation。
一些消息来源报告说,此方法仅在 CDMA/LTE 设备上实现,其他类型的设备(包括 GSM/LTE 设备)将返回 null。在实施时,它将仅返回 LTE 小区。
TelephonyManager.getCellLocation()
将仅返回 GSM/UMTS 或 CDMA 小区。它仅限于一个单元格,即设备当前注册的那个单元格。如果您确定您的代码将仅在 GSM/UMTS 或 CDMA 设备上运行,并且您只对设备当前注册的单元感兴趣,那么这是您最安全的选择。
要获取有关其他周围单元格的信息,请使用TelephonyManager.getNeighboringCellInfo()
. 但是,它仅限于 GSM/UMTS 小区。此外,它的实现取决于无线电固件。大多数三星设备(以及许多其他设备)将返回一个空列表。
结论:目前,在 Android 上获取有关附近小区的信息是一件相当麻烦的事情。您可能需要结合使用所有三种方法来获取所需的信息,即使这样,有些东西也可能无法访问。
以下命令列出了电话上可用的权限:
adb shell pm list permissions -g
在 Nexus 4 (4.2.2) ACCESS_COARSE_UPDATES权限未列出。
更新:
在查看源代码的主分支时,没有对 ACCESS_COARSE_UPDATES 的引用,因此这似乎是文档中的错误。事实上,相关代码只需要 ACCESS_COARSE_LOCATION 和/或 ACCESS_FINE_LOCATION。
通过以下方式进行跟踪:
- 电话经理
- IT电话
- 电话接口管理器
- 全球电话
- 电话工厂
- 手机
- 电话基地
- 服务状态跟踪器
在 ServiceStateTracker 中:
/**
* @return all available cell information or null if none.
*/
public List<CellInfo> getAllCellInfo() {
return null;
}
所以看起来在所有情况下它都会返回一个空值。
这是当前缺陷报告的链接。
该 api 声明如下:
GetAllCellInfo
优先于使用,getCellLocation
尽管对于旧设备,这可能会返回null
,在这种情况下getCellLocation
应该调用。