使用data_usage插件开发应用数据统计功能时出现PERMISSION_NOT_GRANTED异常
报错原因说明
你遇到的PlatformException(PERMISSION_NOT_GRANTED, null, null, null)报错,是因为data_usage插件统计应用流量需要安卓系统的应用使用情况访问权限,该权限属于特殊权限,未授权时直接调用插件接口就会触发未处理异常。
报错截图:
排查步骤
- 检查
android/app/src/main/AndroidManifest.xml中是否已经注册了权限声明 - 调用插件的权限检查接口,确认当前App是否已经拿到授权
- 确认业务逻辑是否存在未申请权限就直接调用流量查询接口的情况
解决方案
1. 注册清单权限
在AndroidManifest.xml的manifest节点下添加对应权限:
<!-- 通用应用使用情况权限 --> <uses-permission android:name="android.permission.PACKAGE_USAGE_STATS" /> <!-- 安卓14及以上版本额外需要的流量历史读取权限 --> <uses-permission android:name="android.permission.READ_NETWORK_USAGE_HISTORY" />
2. 添加权限校验流程
在调用所有流量查询接口前,先执行权限检查和申请逻辑,示例代码如下:
import 'package:data_usage/data_usage.dart'; Future<void> loadAppUsageData() async { // 先检查权限是否已授予 bool isPermissionGranted = await DataUsage.instance.checkPermission(); if (!isPermissionGranted) { // 未授权跳转系统设置页申请权限 await DataUsage.instance.requestPermission(); // 跳转回来后二次检查权限 isPermissionGranted = await DataUsage.instance.checkPermission(); } // 确认权限已获取后再执行业务逻辑 if (isPermissionGranted) { // 调用流量查询接口 var appUsageList = await DataUsage.instance.getUsageForAllApps(); // 处理返回的流量数据 } else { // 权限被拒绝的降级处理,比如弹提示告知用户功能无法使用 } }
3. 适配特殊场景
- 申请权限前建议先弹出自定义提示框,告知用户需要开启「应用使用情况访问权限」才能统计流量数据,降低用户拒绝概率
- 小米、华为、vivo等国产定制系统可能对该权限有额外限制,若走官方申请流程仍无法拿到权限,可引导用户手动进入系统安全设置,找到对应App的权限管理页手动开启应用使用情况权限
- 做好权限被拒绝的兜底逻辑,不要强制调用接口导致App崩溃
内容的提问来源于stack exchange,提问作者Germanus Xavier
相关产品推荐
相关产品推荐

