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

使用on_audio_query时权限弹窗无法弹出的问题求助

解决on_audio_query权限弹窗无法弹出的问题

针对你遇到的权限弹窗不显示问题,可以从以下几个方面排查修复:

1. 适配Android版本更新权限声明

Android 13(API 33)及以上版本对媒体权限做了拆分,原有的READ_EXTERNAL_STORAGE不再生效,需要添加专门的音频权限。修改AndroidManifest.xml的权限配置:

<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<!-- 仅对Android 12及以下版本生效 -->
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" android:maxSdkVersion="32" />
<!-- Android 13及以上版本需要的音频权限 -->
<uses-permission android:name="android.permission.READ_MEDIA_AUDIO" />

另外,WRITE_EXTERNAL_STORAGE对于音频读取场景非必需,可移除。

2. 简化权限请求逻辑,避免混用API

不要同时使用on_audio_query和permission_handler的权限请求方法,前者已经封装了跨版本的权限适配逻辑,直接用它的方法即可。修改你的权限请求代码:

Future<bool> requestPermission(OnAudioQuery audioQuery) async {
  print('开始请求音频权限');
  // retryRequest设为true,确保用户拒绝后仍能再次触发弹窗
  bool hasPermission = await audioQuery.checkAndRequest(retryRequest: true);

  if (!hasPermission) {
    // 权限仍未通过,引导用户去设置页开启
    await openAppSettings();
    print('权限请求失败,已跳转至应用设置页');
  } else {
    print('权限请求成功');
  }

  return hasPermission;
}

3. 确保权限请求的调用时机正确

需要在页面初始化阶段触发权限请求,比如在StatefulWidget的initState中调用:

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

Future<void> _initPermissionAndLoadAudios() async {
  final audioQuery = OnAudioQuery();
  bool granted = await requestPermission(audioQuery);
  if (granted) {
    // 权限通过后再加载音频列表
    _loadDeviceAudios();
  }
}

4. 其他必要配置

  • 针对Android 10(API 29),需要在AndroidManifest.xml的application标签中添加兼容属性:
<application
    ...
    android:requestLegacyExternalStorage="true">
  • 更新on_audio_query和permission_handler到最新版本,避免旧版本的适配bug:
dependencies:
  on_audio_query: ^latest_version
  permission_handler: ^latest_version

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 20:12:23