有一个困惑:
1,我可以得到uid号,例如我的三星9100里面,百度地图的uid号就是10038
2,那就是说当我调用long tx=TrafficStats.getUidRxBytes(10038)方法时(暂时写死),应该可以得到流量信息吧,但我返回的是-1
3,可我从PackageManager获取系统应用包管理,遍历每个应用包信息,请求每个程序包对应的androidManifest.xml里面的权限后,得到的百度地图uid号(其实也是10038),再后面写long tx=TrafficStats.getUidRxBytes(10038)时我就可以得到流量值,这是怎么回事呢?
大神们求解啊,困惑!
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
这个问题涉及到Android系统中获取应用流量统计的API使用,以及权限管理的相关知识。根据您的描述,这里有几个可能的原因和解释:
UID的有效性与权限:TrafficStats.getUidRxBytes(uid)
方法返回-1通常意味着无法获取到该UID的流量信息。这可能是由于以下几个原因:
权限检查的重要性:从PackageManager获取每个应用包信息并检查其Manifest中的权限,这个步骤实际上是在间接确认当前上下文是否有权访问这些信息。这可能帮助确定了必要的安全上下文或者初始化了一些内部状态,使得后续的流量统计调用能够成功。
API调用时机:确保在调用TrafficStats.getUidRxBytes()
时,相关的网络活动已经发生。如果尝试在应用刚启动或网络数据交换之前立即调用,可能会因为此时还没有产生可测量的流量而得到-1。
系统限制和API行为:Android系统的不同版本或不同的设备制造商可能会对API的行为有所差异,包括对隐私和权限管理的严格程度。某些设备或系统版本可能需要更明确的权限声明或用户交互才能允许这样的数据访问。
解决建议: - 确保你的应用具有访问网络状态和统计数据的权限,在AndroidManifest.xml中添加如<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
等必要权限。 - 检查是否在应用运行一段时间且有实际网络活动后调用流量统计API。 - 考虑应用的运行环境和系统版本差异,进行兼容性测试。 - 如果是在模拟器上测试,也请确认模拟器设置正确反映了真实设备的行为。
希望以上分析能帮助您解决问题,如果还有其他技术细节需要探讨,欢迎继续提问!