Flutter音频查询插件on_audio_query_forked的使用
Flutter音频查询插件on_audio_query_forked的使用
安装
在 pubspec.yaml
文件中添加以下代码:
dependencies:
on_audio_query: ^2.9.0
请求权限
Android:
在 AndroidManifest.xml
中添加以下代码:
<manifest>
<!-- Android 12 或以下 -->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<!-- Android 13 或以上 -->
<uses-permission android:name="android.permission.READ_MEDIA_IMAGES"/>
<uses-permission android:name="android.permission.READ_MEDIA_VIDEO"/>
<uses-permission android:name="android.permission.READ_MEDIA_AUDIO"/>
</manifest>
iOS:
在 Info.plist
中添加以下代码:
<dict>
<key>NSAppleMusicUsageDescription</key>
<string>$(PROJECT_NAME) requires access to media library</string>
</dict>
示例代码
下面是一个完整的示例代码,展示了如何使用 on_audio_query_forked
插件来查询音频信息。
import 'package:flutter/material.dart';
import 'package:on_audio_query_forked/on_audio_query.dart';
void main() {
runApp(
const MaterialApp(
home: Songs(),
),
);
}
class Songs extends StatefulWidget {
const Songs({Key? key}) : super(key: key);
[@override](/user/override)
_SongsState createState() => _SongsState();
}
class _SongsState extends State<Songs> {
// 主方法。
final OnAudioQuery _audioQuery = OnAudioQuery();
// 指示应用程序是否具有访问库的权限。
bool _hasPermission = false;
[@override](/user/override)
void initState() {
super.initState();
// (可选) 设置日志级别。默认将设置为 'WARN'。
//
// 日志将在以下位置出现:
// * XCode:调试控制台
// * VsCode:调试控制台
// * Android Studio:调试和 Logcat 控制台
LogConfig logConfig = LogConfig(logType: LogType.DEBUG);
_audioQuery.setLogConfig(logConfig);
// 检查并请求权限。
checkAndRequestPermissions();
}
Future<void> checkAndRequestPermissions({bool retry = false}) async {
// 如果参数 'retryRequest' 为 false,则默认为 false。
_hasPermission = await _audioQuery.checkAndRequest(
retryRequest: retry,
);
// 只有在应用程序具有所有所需权限时才更新 UI。
_hasPermission ? setState(() {}) : null;
}
[@override](/user/override)
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: const Text("OnAudioQueryExample"),
elevation: 2,
),
body: Center(
child: !_hasPermission
? noAccessToLibraryWidget()
: FutureBuilder<List<SongModel>>(
// 默认值:
future: _audioQuery.querySongs(
sortType: null,
orderType: OrderType.ASC_OR_SMALLER,
uriType: UriType.EXTERNAL,
ignoreCase: true,
),
builder: (context, item) {
// 显示任何错误。
if (item.hasError) {
return Text(item.error.toString());
}
// 等待内容。
if (item.data == null) {
return const CircularProgressIndicator();
}
// 'Library' 是空的。
if (item.data!.isEmpty) return const Text("Nothing found!");
// 您可以使用 [item.data!] 直接或创建一个:
// List<SongModel> songs = item.data!;
return ListView.builder(
itemCount: item.data!.length,
itemBuilder: (context, index) {
return ListTile(
title: Text(item.data![index].title),
subtitle: Text(item.data![index].artist ?? "No Artist"),
trailing: const Icon(Icons.arrow_forward_rounded),
// 这个 Widget 将查询/加载图像。
// 您可以使用/创建自己的 Widget/方法使用 [queryArtwork]。
leading: QueryArtworkWidget(
controller: _audioQuery,
id: item.data![index].id,
type: ArtworkType.AUDIO,
),
);
},
);
},
),
),
);
}
Widget noAccessToLibraryWidget() {
return Container(
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(10),
color: Colors.redAccent.withOpacity(0.5),
),
padding: const EdgeInsets.all(20),
child: Column(
mainAxisSize: MainAxisSize.min,
children: [
const Text("Application doesn't have access to the library"),
const SizedBox(height: 11),
ElevatedButton(
onPressed: () => checkAndRequestPermissions(retry: true),
child: const Text("Allow"),
),
],
),
);
}
}
更多关于Flutter音频查询插件on_audio_query_forked的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于Flutter音频查询插件on_audio_query_forked的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
当然,以下是如何在Flutter项目中使用on_audio_query_forked
插件来查询音频文件的示例代码。这个插件允许你查询设备上的音频文件,获取它们的详细信息。
1. 添加依赖
首先,你需要在pubspec.yaml
文件中添加on_audio_query_forked
依赖:
dependencies:
flutter:
sdk: flutter
on_audio_query_forked: ^3.2.1 # 确保使用最新版本
2. 导入插件
在你的Dart文件中(例如main.dart
),导入插件:
import 'package:flutter/material.dart';
import 'package:on_audio_query_forked/on_audio_query_forked.dart';
3. 初始化插件
在应用程序启动时初始化音频查询插件:
void main() async {
WidgetsFlutterBinding.ensureInitialized();
final AudioQuery audioQuery = AudioQuery();
await audioQuery.open(); // 打开数据库连接
runApp(MyApp(audioQuery: audioQuery));
}
4. 使用插件查询音频文件
创建一个简单的Flutter应用来查询并显示音频文件。以下是一个完整的示例:
class MyApp extends StatelessWidget {
final AudioQuery audioQuery;
MyApp({required this.audioQuery});
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
appBar: AppBar(
title: Text('Audio Query Example'),
),
body: AudioQueryExample(audioQuery: audioQuery),
),
);
}
}
class AudioQueryExample extends StatefulWidget {
final AudioQuery audioQuery;
AudioQueryExample({required this.audioQuery});
@override
_AudioQueryExampleState createState() => _AudioQueryExampleState();
}
class _AudioQueryExampleState extends State<AudioQueryExample> {
List<Audio> audios = [];
@override
void initState() {
super.initState();
fetchAudios();
}
void fetchAudios() async {
// 查询所有音频文件
var result = await widget.audioQuery.getAllMusic(withAlbums: true);
setState(() {
audios = result;
});
}
@override
Widget build(BuildContext context) {
return ListView.builder(
itemCount: audios.length,
itemBuilder: (context, index) {
var audio = audios[index];
return ListTile(
title: Text(audio.title ?? 'Unknown Title'),
subtitle: Text('Artist: ${audio.artist} | Album: ${audio.album}'),
trailing: IconButton(
icon: Icon(Icons.play_arrow),
onPressed: () {
// 在这里处理播放音频的逻辑
// 例如使用另一个插件来播放音频
print('Play ${audio.title}');
},
),
);
},
);
}
}
5. 清理资源
别忘了在应用程序关闭时关闭数据库连接:
@override
void dispose() {
widget.audioQuery.close(); // 关闭数据库连接
super.dispose();
}
总结
上述代码展示了如何在Flutter项目中使用on_audio_query_forked
插件查询设备上的音频文件,并将它们显示在一个列表中。你可以根据需要进一步扩展这个示例,例如添加音频播放功能。