Flutter媒体播放插件nq_media_player的使用

Flutter媒体播放插件nq_media_player的使用

nq_media_player

nq_media_player 是一个 Flutter 插件,用于控制手机系统的音乐播放器。该插件允许用户在顶部和底部之间切换歌曲,并播放或暂停音乐。

插件状态 版本号 许可证 Flutter官网

特性

您可以使用此插件来控制手机系统播放器的播放和暂停,切换歌曲,并监控播放状态。

开始使用

此项目是一个 Flutter 插件包的起点,包含 Android 和/或 iOS 的平台特定实现代码。

要开始使用 Flutter 开发,请查看 官方文档,其中包含教程、示例、移动开发指南以及完整的 API 参考。

使用方法

获取插件实例

final NqMediaPlayer _player = NqMediaPlayer();

检查初始音乐状态

Future<void> _checkInitialMusicState() async {
  try {
    final bool isPlaying = await _player.isMusicOn();
    if (mounted) {
      setState(() => _isPlaying = isPlaying);
    }
  } catch (e) {
    debugPrint('Error checking initial music state: $e');
  }
}

设置音乐监听器

void _setupMusicListener() {
  _player.musicStateStream.listen(
    (bool isPlaying) {
      if (mounted) {
        setState(() => _isPlaying = isPlaying);
      }
    },
    onError: (error) {
      debugPrint('Error in music state stream: $error');
    },
  );
}

切换歌曲

_player.lastMusic(); // 上一首
_player.nextMusic(); // 下一首

示例代码

以下是一个完整的示例代码,展示了如何使用 nq_media_player 插件:

import 'package:flutter/material.dart';
import 'package/flutter/services.dart';
import 'package:nq_media_player/nq_media_player.dart';

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

class MyApp extends StatelessWidget {
  const MyApp({Key? key}) : super(key: key);

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'NQ Media Player Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
        brightness: Brightness.dark,
        useMaterial3: true,
      ),
      home: const MediaControlPage(),
    );
  }
}

class MediaControlPage extends StatefulWidget {
  const MediaControlPage({Key? key}) : super(key: key);

  [@override](/user/override)
  State<MediaControlPage> createState() => _MediaControlPageState();
}

class _MediaControlPageState extends State<MediaControlPage> with SingleTickerProviderStateMixin {
  final NqMediaPlayer _player = NqMediaPlayer();
  bool _isPlaying = false;
  late AnimationController _animationController;
  String _platformVersion = 'Unknown';

  [@override](/user/override)
  void initState() {
    super.initState();
    _animationController = AnimationController(
      duration: const Duration(milliseconds: 300),
      vsync: this,
    );
    _initPlatformState();
    _checkInitialMusicState();
    _setupMusicListener();
  }

  Future<void> _initPlatformState() async {
    String platformVersion;
    try {
      platformVersion = await _player.getPlatformVersion() ?? 'Unknown platform version';
    } catch (e) {
      platformVersion = 'Failed to get platform version';
    }
    if (!mounted) return;
    setState(() => _platformVersion = platformVersion);
  }

  Future<void> _checkInitialMusicState() async {
    try {
      final bool isPlaying = await _player.isMusicOn();
      if (mounted) {
        setState(() => _isPlaying = isPlaying);
        if (isPlaying) {
          _animationController.forward();
        }
      }
    } catch (e) {
      debugPrint('Error checking initial music state: $e');
    }
  }

  void _setupMusicListener() {
    _player.musicStateStream.listen(
      (bool isPlaying) {
        if (mounted) {
          setState(() => _isPlaying = isPlaying);
          if (isPlaying) {
            _animationController.forward();
          } else {
            _animationController.reverse();
          }
        }
      },
      onError: (error) {
        debugPrint('Error in music state stream: $error');
      },
    );
  }

  [@override](/user/override)
  void dispose() {
    _animationController.dispose();
    super.dispose();
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return AnnotatedRegion(
      value: SystemUiOverlayStyle(
        statusBarColor: Colors.transparent,
        systemNavigationBarColor: Colors.greenAccent,
        systemNavigationBarDividerColor: Colors.greenAccent,
        systemStatusBarContrastEnforced: true,
        systemNavigationBarContrastEnforced: false,
        statusBarIconBrightness: Brightness.light,
        statusBarBrightness: Brightness.light,
        systemNavigationBarIconBrightness: Brightness.light,
      ),
      child: Scaffold(
        body: Container(
          decoration: BoxDecoration(
            gradient: LinearGradient(
              begin: Alignment.topLeft,
              end: Alignment.bottomRight,
              colors: [
                Colors.blue.shade900,
                Colors.purple.shade900,
              ],
            ),
          ),
          child: SafeArea(
            child: Column(
              children: [
                _buildHeader(),
                const Spacer(),
                _buildMusicControls(),
                const Spacer(),
                _buildPlatformInfo(),
              ],
            ),
          ),
        ),
      ),
    );
  }

  Widget _buildHeader() {
    return Padding(
      padding: const EdgeInsets.all(20.0),
      child: Column(
        children: [
          const Text(
            'NQ Media Player',
            style: TextStyle(
              fontSize: 28,
              fontWeight: FontWeight.bold,
              color: Colors.white,
            ),
          ),
          const SizedBox(height: 8),
          Text(
            'Music Control Demo',
            style: TextStyle(
              fontSize: 16,
              color: Colors.white.withOpacity(0.7),
            ),
          ),
        ],
      ),
    );
  }

  Widget _buildMusicControls() {
    return Column(
      mainAxisSize: MainAxisSize.min,
      children: [
        _buildMusicStatusIndicator(),
        const SizedBox(height: 40),
        Row(
          mainAxisAlignment: MainAxisAlignment.center,
          children: [
            _buildControlButton(
              icon: Icons.skip_previous,
              onPressed: () => _player.lastMusic(),
            ),
            const SizedBox(width: 20),
            _buildPlayPauseButton(),
            const SizedBox(width: 20),
            _buildControlButton(
              icon: Icons.skip_next,
              onPressed: () => _player.nextMusic(),
            ),
          ],
        ),
      ],
    );
  }

  Widget _buildMusicStatusIndicator() {
    return Container(
      width: 200,
      height: 200,
      decoration: BoxDecoration(
        shape: BoxShape.circle,
        gradient: LinearGradient(
          colors: [Colors.blue.shade400, Colors.purple.shade400],
        ),
        boxShadow: [
          BoxShadow(
            color: Colors.black.withOpacity(0.3),
            blurRadius: 15,
            spreadRadius: 5,
          ),
        ],
      ),
      child: Center(
        child: RotationTransition(
          turns: Tween(begin: 0.0, end: 1.0).animate(_animationController),
          child: Icon(
            _isPlaying ? Icons.music_note : Icons.music_off,
            size: 80,
            color: Colors.white,
          ),
        ),
      ),
    );
  }

  Widget _buildPlayPauseButton() {
    return GestureDetector(
      onTap: () async {
        try {
          await _player.switchMusicOn();
        } catch (e) {
          if (mounted) {
            ScaffoldMessenger.of(context).showSnackBar(
              SnackBar(
                content: Text('Error controlling playback: $e'),
                backgroundColor: Colors.red,
              ),
            );
          }
        }
      },
      child: Container(
        width: 80,
        height: 80,
        decoration: BoxDecoration(
          shape: BoxShape.circle,
          color: Colors.white,
          boxShadow: [
            BoxShadow(
              color: Colors.white.withOpacity(0.2),
              blurRadius: 10,
              spreadRadius: 2,
            ),
          ],
        ),
        child: Icon(
          _isPlaying ? Icons.pause : Icons.play_arrow,
          size: 40,
          color: Colors.blue.shade900,
        ),
      ),
    );
  }

  Widget _buildControlButton({
    required IconData icon,
    required VoidCallback onPressed,
  }) {
    return GestureDetector(
      onTap: () async {
        try {
           onPressed();
        } catch (e) {
          if (mounted) {
            ScaffoldMessenger.of(context).showSnackBar(
              SnackBar(
                content: Text('Error controlling playback: $e'),
                backgroundColor: Colors.red,
              ),
            );
          }
        }
      },
      child: Container(
        width: 60,
        height: 60,
        decoration: BoxDecoration(
          shape: BoxShape.circle,
          color: Colors.white.withOpacity(0.2),
        ),
        child: Icon(
          icon,
          size: 30,
          color: Colors.white,
        ),
      ),
    );
  }

  Widget _buildPlatformInfo() {
    return Container(
      margin: const EdgeInsets.all(20),
      padding: const EdgeInsets.symmetric(
        horizontal: 20,
        vertical: 10,
      ),
      decoration: BoxDecoration(
        color: Colors.white.withOpacity(0.1),
        borderRadius: BorderRadius.circular(15),
      ),
      child: Row(
        mainAxisSize: MainAxisSize.min,
        children: [
          const Icon(
            Icons.info_outline,
            color: Colors.white70,
          ),
          const SizedBox(width: 10),
          Text(
            'Platform: $_platformVersion',
            style: const TextStyle(
              color: Colors.white70,
              fontSize: 14,
            ),
          ),
        ],
      ),
    );
  }
}

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

1 回复

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


当然,以下是一个关于如何使用Flutter媒体播放插件 nq_media_player 的代码示例。这个示例展示了如何在Flutter应用中集成并使用 nq_media_player 插件进行媒体播放。

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

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

然后运行 flutter pub get 来获取依赖。

接下来,你可以在你的 Flutter 应用中使用 nq_media_player。以下是一个简单的示例代码:

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

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Media Player Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: MediaPlayerScreen(),
    );
  }
}

class MediaPlayerScreen extends StatefulWidget {
  @override
  _MediaPlayerScreenState createState() => _MediaPlayerScreenState();
}

class _MediaPlayerScreenState extends State<MediaPlayerScreen> {
  NqMediaPlayerController? _controller;

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

  void _initPlayer() {
    _controller = NqMediaPlayerController(
      dataSource: 'https://www.example.com/your-media-file.mp3', // 替换为你的媒体文件URL
      autoPlay: true,
      looping: false,
    )..initialize().then((_) {
      // 初始化完成后,可以在这里做一些操作,比如开始播放
      _controller?.play();
    }).catchError((error) {
      // 处理初始化错误
      print('初始化播放器失败: $error');
    });
  }

  @override
  void dispose() {
    _controller?.dispose();
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Flutter Media Player Demo'),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            if (_controller != null && _controller!.value.isInitialized)
              ElevatedButton(
                onPressed: () {
                  if (_controller!.value.isPlaying) {
                    _controller?.pause();
                  } else {
                    _controller?.play();
                  }
                },
                child: Text(_controller!.value.isPlaying ? 'Pause' : 'Play'),
              ),
            SizedBox(height: 20),
            ElevatedButton(
              onPressed: () {
                _controller?.seekTo(Duration(seconds: 10)); // 跳转到10秒
              },
              child: Text('Seek to 10s'),
            ),
            SizedBox(height: 20),
            ElevatedButton(
              onPressed: () {
                _controller?.stop();
              },
              child: Text('Stop'),
            ),
          ],
        ),
      ),
    );
  }
}

在这个示例中,我们做了以下几件事:

  1. 初始化 NqMediaPlayerController:在 initState 方法中,我们创建了 NqMediaPlayerController 实例,并指定了媒体文件的 URL、是否自动播放和是否循环播放。然后调用 initialize 方法来初始化播放器。

  2. 播放控制:在界面上,我们提供了播放/暂停、跳转到特定时间和停止播放的按钮。通过调用 _controller 的相应方法来控制播放。

  3. 释放资源:在 dispose 方法中,我们调用 _controller?.dispose() 来释放播放器资源。

请根据你的实际需求调整代码,比如媒体文件的 URL、按钮的样式等。这个示例只是一个基本的演示,你可以根据需要进行扩展和自定义。

回到顶部