You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android中使用android_package_manager获取应用权限并通过ListTile展示失败问题

解决Android应用权限列表不显示的问题

问题根源

你的代码无法正常展示权限列表,主要有两个关键问题:

  1. 异步更新未触发UI重建:pm.getPackageInfo是异步操作,更新permissionList后没有通知Flutter刷新界面,所以列表始终是空的。
  2. 权限数据不符预期:requestedPermissions返回的是应用Manifest中声明的权限,并非设备实际授予的权限,这可能和你想展示的"已拥有权限"不一致。

修复方案

1. 改用StatefulWidget管理状态

只有通过setState才能让Flutter感知到数据变化并更新UI,以下是完整的可运行代码:

class PermissionListItem extends StatefulWidget {
  final String packageName;

  const PermissionListItem({super.key, required this.packageName});

  @override
  State<PermissionListItem> createState() => _PermissionListItemState();
}

class _PermissionListItemState extends State<PermissionListItem> {
  List<String> _declaredPermissions = [];
  List<String> _grantedPermissions = [];
  final AndroidPackageManager _packageManager = AndroidPackageManager();

  @override
  void initState() {
    super.initState();
    _loadPermissionData();
  }

  Future<void> _loadPermissionData() async {
    try {
      final packageInfo = await _packageManager.getPackageInfo(packageName: widget.packageName);
      if (packageInfo?.requestedPermissions != null) {
        setState(() {
          _declaredPermissions = packageInfo!.requestedPermissions!;
        });
        // 同步获取已授予的权限状态
        await _fetchGrantedPermissions(_declaredPermissions);
      }
    } catch (e) {
      print('加载权限失败: $e'); // 打印异常辅助排查
    }
  }

  Future<void> _fetchGrantedPermissions(List<String> permissions) async {
    final List<String> granted = [];
    for (final perm in permissions) {
      final status = await _packageManager.checkPermission(perm);
      if (status == PermissionStatus.granted) {
        granted.add(perm);
      }
    }
    setState(() {
      _grantedPermissions = granted;
    });
  }

  @override
  Widget build(BuildContext context) {
    return ListTile(
      title: const Text('权限'),
      subtitle: _declaredPermissions.isEmpty
          ? const Text('加载中...')
          : ListView.builder(
              shrinkWrap: true,
              physics: const NeverScrollableScrollPhysics(), // 解决嵌套滚动冲突
              itemCount: _declaredPermissions.length,
              itemBuilder: (context, index) {
                final perm = _declaredPermissions[index];
                final isGranted = _grantedPermissions.contains(perm);
                return Text(
                  '$perm ${isGranted ? '(已授予)' : '(未授予)'}',
                  style: TextStyle(color: isGranted ? Colors.green : Colors.grey),
                );
              },
            ),
    );
  }
}

2. 关键修复点说明

  • 状态更新:通过setState在异步获取权限后触发UI重建,确保数据变化能展示出来。
  • 异常捕获:添加try-catch捕获异步操作中的错误,比如包名无效、缺少系统权限等问题都能通过打印信息排查。
  • 权限状态区分:用checkPermission获取实际授予状态,区分声明权限和已授予权限,展示更准确的信息。
  • 滚动冲突处理:给内部ListView添加NeverScrollableScrollPhysics,避免和外部列表的滚动行为冲突。

3. 必要的系统权限

Android 11及以上版本,需要在AndroidManifest.xml中添加权限才能查询其他应用的信息:

<uses-permission android:name="android.permission.QUERY_ALL_PACKAGES" />

如果只需要查询特定应用,也可以使用更合规的packageQuery权限,具体可参考Android官方权限规范。

内容的提问来源于stack exchange,提问作者Jan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 13:05:35