8

我的 Android 版本是 4.2.1,我正在尝试使用TelephonyManager.getAllCellInfo()方法。在我的清单文件中,我拥有ACCESS_COARSE_UPDATES, ACCESS_COARSE_LOCATION,ACCESS_FINE_LOCATION权限。但是该方法返回null.

4

3 回答 3

8

来自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 上获取有关附近小区的信息是一件相当麻烦的事情。您可能需要结合使用所有三种方法来获取所需的信息,即使这样,有些东西也可能无法访问。

于 2013-09-08T20:19:26.327 回答
5

以下命令列出了电话上可用的权限:

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;
}

所以看起来在所有情况下它都会返回一个空值。

是当前缺陷报告的链接。

于 2013-05-17T19:20:25.270 回答
-1

该 api 声明如下:

GetAllCellInfo优先于使用,getCellLocation尽管对于旧设备,这可能会返回null,在这种情况下getCellLocation应该调用。

于 2015-11-09T09:10:02.550 回答