Flutter音乐播放插件musicfy的使用

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

Flutter音乐播放插件musicfy的使用

特性

  • 从设备的媒体库中检索音乐文件列表。
  • 获取每首曲目的元数据:标题、艺术家、专辑和路径。
  • 处理权限请求以访问媒体库。

开始使用

此项目是一个Flutter插件,它为在Android和iOS设备上访问音乐元数据提供了简单的接口。

安装

要在您的Flutter项目中使用musicfy,将其添加到pubspec.yaml文件中:

dependencies:
  musicfy: ^1.0.0

然后运行以下命令:

flutter pub get
平台设置
Android
  1. 打开AndroidManifest.xml文件并添加所需的权限以访问媒体库:
<uses-permission android:name="android.permission.READ_MEDIA_AUDIO" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
  1. 确保使用permission_handler包处理运行时权限。
iOS

iOS的支持即将推出。请确保在Info.plist文件中添加必要的权限:

<key>NSAppleMusicUsageDescription</key>
<string>我们需要访问您的音乐库</string>

此功能尚未完全支持,但将在未来的版本中提供。

使用方法

以下是您如何在Flutter应用程序中使用musicfy插件的方法:

  1. 导入musicfy包:
import 'package:musicfy/musicfy.dart';
import 'package:permission_handler/permission_handler.dart';
  1. 请求访问媒体库所需的权限:
PermissionStatus status = await Permission.audio.request();
if (status.isGranted) {
  final musicList = await Musicfy().getMusicList();
  // 处理音乐列表
} else {
  // 处理权限被拒绝的情况
}
  1. 显示检索到的音乐列表:
ListView.builder(
  itemCount: musicList.length,
  itemBuilder: (context, index) {
    final music = musicList[index];
    return ListTile(
      title: Text(music['title']),
      subtitle: Text('${music['artist']} - ${music['album']}'),
      leading: Icon(Icons.music_note),
    );
  },
);

API

getMusicList()
  • 返回值:一个包含以下键的地图列表:
    • title:曲目的标题。
    • artist:曲目的艺术家。
    • album:曲目的专辑名称。
    • path:曲目在设备上的文件路径。

权限

该插件需要以下权限:

  • AndroidREAD_EXTERNAL_STORAGEREAD_MEDIA_AUDIO
  • iOSNSAppleMusicUsageDescription(未来iOS支持)

请确保使用permission_handler包在运行时请求权限。

贡献

我们欢迎对musicfy插件的贡献!请按照以下步骤进行贡献:

  1. 分叉仓库。
  2. 创建一个新的分支。
  3. 进行您的更改。
  4. 运行测试以确保一切正常工作。
  5. 提交一个拉取请求。

作者

该项目由Meysam Alizadeh维护。 邮箱:m10551691@gmail.com

许可证

该项目受MIT许可证保护 - 详情请参阅LICENSE文件。


示例代码

import 'package:flutter/material.dart';
import 'package:permission_handler/permission_handler.dart';
import 'package:musicfy/musicfy.dart';
import 'package:just_audio/just_audio.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatefulWidget {
  [@override](/user/override)
  _MyAppState createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  final Musicfy _musicfy = Musicfy();
  final AudioPlayer _audioPlayer = AudioPlayer();
  List<dynamic> _musicList = [];
  String? _currentlyPlaying;

  [@override](/user/override)
  void initState() {
    super.initState();
    fetchMusicList();
  }

  [@override](/user/override)
  void dispose() {
    // 释放AudioPlayer以避免资源占用
    _audioPlayer.dispose();
    super.dispose();
  }

  Future<void> fetchMusicList() async {
    // 请求媒体访问权限
    PermissionStatus status = await Permission.audio.request();

    if (status.isGranted) {
      try {
        // 如果权限被授予,获取音乐列表
        final musicList = await _musicfy.getMusicList();
        setState(() {
          _musicList = musicList;
        });
      } catch (e) {
        print('Error fetching music list: $e');
      }
    } else if (status.isPermanentlyDenied) {
      // 如果权限永久被拒绝,引导用户到应用设置
      print('Permission permanently denied. Redirecting to app settings...');
      openAppSettings();
    } else {
      // 如果权限被拒绝
      print('Permission denied.');
    }
  }

  Future<void> playMusic(String path) async {
    try {
      await _audioPlayer.setFilePath(path); // 设置文件路径以播放
      await _audioPlayer.play(); // 播放音乐
      setState(() {
        _currentlyPlaying = path;
      });
    } catch (e) {
      print('Error playing music: $e');
    }
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Musicfy Plugin Example'),
        ),
        body: _musicList.isEmpty
            ? Center(
                child: Text('No music found or permission denied.'),
              )
            : ListView.builder(
                itemCount: _musicList.length,
                itemBuilder: (context, index) {
                  final music = _musicList[index];
                  final isPlaying = _currentlyPlaying == music['path'];
                  return ListTile(
                    title: Text(music['title']),
                    subtitle: Text('${music['artist']} - ${music['album']}'),
                    trailing: IconButton(
                      icon: Icon(
                        isPlaying ? Icons.pause_circle : Icons.play_circle,
                        color: isPlaying ? Colors.green : Colors.blue,
                      ),
                      onPressed: () {
                        playMusic(music['path']);
                      },
                    ),
                  );
                },
              ),
      ),
    );
  }
}

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

1 回复

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


当然,作为一个IT专家,我可以为你提供一个关于如何使用Flutter音乐播放插件musicfy的代码案例。下面是一个基本的示例,展示如何在Flutter应用中使用musicfy插件来播放音乐。

首先,确保你已经在pubspec.yaml文件中添加了musicfy依赖:

dependencies:
  flutter:
    sdk: flutter
  musicfy: ^最新版本号  # 请替换为实际的最新版本号

然后,运行flutter pub get来安装依赖。

接下来,在你的Flutter应用中,你可以按照以下步骤使用musicfy插件:

  1. 导入musicfy
import 'package:musicfy/musicfy.dart';
  1. 初始化Musicfy实例

在应用的入口文件(通常是main.dart)中初始化Musicfy实例:

void main() {
  WidgetsFlutterBinding.ensureInitialized();
  Musicfy.instance.init(); // 初始化Musicfy实例
  runApp(MyApp());
}
  1. 设置音频文件并播放

在你的主组件或其他组件中,设置音频文件并播放:

import 'package:flutter/material.dart';
import 'package:musicfy/musicfy.dart';

class MyApp extends StatefulWidget {
  @override
  _MyAppState createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  MusicfyController _musicfyController;

  @override
  void initState() {
    super.initState();
    _musicfyController = MusicfyController();
    _setupMusicfy();
  }

  void _setupMusicfy() {
    // 设置音频文件路径(可以是本地文件或网络URL)
    String audioUrl = 'https://example.com/audio/song.mp3'; // 替换为实际的音频URL

    // 配置Musicfy
    MusicfyConfig config = MusicfyConfig(
      audioUrl: audioUrl,
      isLooping: false,
      isShuffle: false,
      volume: 1.0,
      notification: true,
      headsetControl: true,
      lockScreenControl: true,
    );

    // 应用配置并准备播放
    _musicfyController.setConfig(config);
    _musicfyController.prepare();
  }

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Musicfy Demo'),
        ),
        body: Center(
          child: Column(
            mainAxisAlignment: MainAxisAlignment.center,
            children: <Widget>[
              ElevatedButton(
                onPressed: () {
                  _musicfyController.playOrPause();
                },
                child: Text('Play/Pause'),
              ),
              ElevatedButton(
                onPressed: () {
                  _musicfyController.stop();
                },
                child: Text('Stop'),
              ),
            ],
          ),
        ),
      ),
    );
  }

  @override
  void dispose() {
    _musicfyController.dispose();
    super.dispose();
  }
}

在这个示例中,我们创建了一个MusicfyController实例,并设置了音频文件的URL和一些播放配置。然后,我们提供了两个按钮来播放/暂停和停止音乐。

请注意,你需要将audioUrl替换为实际的音频文件URL或本地文件路径。如果你使用本地文件,确保文件已经包含在应用的assets中,并在pubspec.yaml文件中正确配置。

此外,Musicfy插件还提供了许多其他功能,如获取播放状态、播放进度、音量控制等,你可以根据需要查阅musicfy的官方文档来了解更多详细信息。

回到顶部