开发者社区 问答 正文

Android 流量统计TrafficStats.getUidRxBytes(uid)得到-1报错

有一个困惑:

1,我可以得到uid号,例如我的三星9100里面,百度地图的uid号就是10038

2,那就是说当我调用long tx=TrafficStats.getUidRxBytes(10038)方法时(暂时写死),应该可以得到流量信息吧,但我返回的是-1

3,可我从PackageManager获取系统应用包管理,遍历每个应用包信息,请求每个程序包对应的androidManifest.xml里面的权限后,得到的百度地图uid号(其实也是10038),再后面写long tx=TrafficStats.getUidRxBytes(10038)时我就可以得到流量值,这是怎么回事呢?

大神们求解啊,困惑!

展开
收起
kun坤 2020-06-14 09:32:21 635 分享 版权
阿里云 AI 助理回答

这个问题涉及到Android系统中获取应用流量统计的API使用,以及权限管理的相关知识。根据您的描述,这里有几个可能的原因和解释:

  1. UID的有效性与权限TrafficStats.getUidRxBytes(uid)方法返回-1通常意味着无法获取到该UID的流量信息。这可能是由于以下几个原因:

    • 权限问题:尽管您提到百度地图的UID是10038,并且直接调用时返回-1,但通过PackageManager遍历并检查权限后再次调用成功,这暗示了可能存在权限问题。直接调用可能在某些环境下没有足够的权限去访问其他应用的流量数据。
    • 应用状态:如果目标应用(在这个例子中是百度地图)尚未运行或被系统杀死,有时也可能导致无法获取其流量信息。
  2. 权限检查的重要性:从PackageManager获取每个应用包信息并检查其Manifest中的权限,这个步骤实际上是在间接确认当前上下文是否有权访问这些信息。这可能帮助确定了必要的安全上下文或者初始化了一些内部状态,使得后续的流量统计调用能够成功。

  3. API调用时机:确保在调用TrafficStats.getUidRxBytes()时,相关的网络活动已经发生。如果尝试在应用刚启动或网络数据交换之前立即调用,可能会因为此时还没有产生可测量的流量而得到-1。

  4. 系统限制和API行为:Android系统的不同版本或不同的设备制造商可能会对API的行为有所差异,包括对隐私和权限管理的严格程度。某些设备或系统版本可能需要更明确的权限声明或用户交互才能允许这样的数据访问。

解决建议: - 确保你的应用具有访问网络状态和统计数据的权限,在AndroidManifest.xml中添加如<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>等必要权限。 - 检查是否在应用运行一段时间且有实际网络活动后调用流量统计API。 - 考虑应用的运行环境和系统版本差异,进行兼容性测试。 - 如果是在模拟器上测试,也请确认模拟器设置正确反映了真实设备的行为。

希望以上分析能帮助您解决问题,如果还有其他技术细节需要探讨,欢迎继续提问!

有帮助
无帮助
AI 助理回答生成答案可能存在不准确,仅供参考
0 条回答
写回答
取消 提交回答