Flutter音频查询插件on_audio_query_forked的使用

发布于 1周前 作者 zlyuanteng 来自 Flutter

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 中添加以下代码:

&lt;dict&gt;

	&lt;key&gt;NSAppleMusicUsageDescription&lt;/key&gt;
	&lt;string&gt;$(PROJECT_NAME) requires access to media library&lt;/string&gt;

&lt;/dict&gt;

示例代码

下面是一个完整的示例代码,展示了如何使用 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&lt;SongModel&gt; 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: () =&gt; checkAndRequestPermissions(retry: true),
            child: const Text("Allow"),
          ),
        ],
      ),
    );
  }
}

更多关于Flutter音频查询插件on_audio_query_forked的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于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插件查询设备上的音频文件,并将它们显示在一个列表中。你可以根据需要进一步扩展这个示例,例如添加音频播放功能。

回到顶部