Flutter系统媒体控制插件system_media_controller的使用

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

Flutter系统媒体控制插件system_media_controller的使用

System Media Controller插件

pub package

System Media Control包是一个允许你在系统上控制媒体的Flutter插件。

目前仅适用于Android平台。

使用方法

要使用此插件,在你的pubspec.yaml文件中添加system_media_controller作为依赖项。

示例代码:

你可以控制当前系统的媒体。

final _systemMediaController = SystemMediaController();

_systemMediaController.play();
_systemMediaController.pause();
_systemMediaController.skipNext();
_systemMediaController.skipPrevious();
_systemMediaController.fastForward();
_systemMediaController.rewind();

使用FCM控制媒体

如果你使用FCM(静默通知)并且希望在其他平台(如Flutter Web)上控制移动设备上的媒体播放,可以参考以下示例代码。

// 示例FCM代码
Map silentNotification = {
    'message': {
        'data': {
            'action': 'play'
        }
    }
}

FirebaseMessaging.onBackgroundMessage((message){
    /// ...其他代码
    final String? action = message.data['action'];
    if(action == 'play'){
        _systemMediaController.play();
    }
});

完整示例Demo

以下是完整的示例代码,展示了如何在Flutter应用中使用system_media_controller插件来控制媒体。

import 'dart:async';
import 'package:flutter/material.dart';
import 'package:system_media_controller/system_media_controller.dart';

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

class MyApp extends StatefulWidget {
  const MyApp({super.key});

  [@override](/user/override)
  State<MyApp> createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  // 初始化SystemMediaController实例
  final _systemMediaControllerPlugin = SystemMediaController();

  // 定义各种控制方法
  Future<bool> _play() => _systemMediaControllerPlugin.play();
  Future<bool> _pause() => _systemMediaControllerPlugin.pause();
  Future<bool> _skipNext() => _systemMediaControllerPlugin.skipNext();
  Future<bool> _skipPrevious() => _systemMediaControllerPlugin.skipPrevious();
  Future<bool> _rewind() => _systemMediaControllerPlugin.rewind();
  Future<bool> _fastForward() => _systemMediaControllerPlugin.fastForward();

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: const Text('系统媒体控制器示例应用'),
        ),
        body: Center(
          child: ButtonBar(
            alignment: MainAxisAlignment.center,
            children: [
              // 播放按钮
              IconButton(
                onPressed: _play,
                icon: const Icon(Icons.play_arrow),
              ),
              // 暂停按钮
              IconButton(
                onPressed: _pause,
                icon: const Icon(Icons.pause),
              ),
              // 下一首按钮
              IconButton(
                onPressed: _skipNext,
                icon: const Icon(Icons.skip_next),
              ),
              // 上一首按钮
              IconButton(
                onPressed: _skipPrevious,
                icon: const Icon(Icons.skip_previous),
              ),
              // 倒退按钮
              IconButton(
                onPressed: _rewind,
                icon: const Icon(Icons.fast_rewind),
              ),
              // 快进按钮
              IconButton(
                onPressed: _fastForward,
                icon: const Icon(Icons.fast_forward),
              ),
            ],
          ),
        ),
      ),
    );
  }
}

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

1 回复

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


当然,下面是一个关于如何使用Flutter的system_media_controller插件的示例代码。这个插件允许你的Flutter应用控制系统的媒体播放,比如在通知栏中显示媒体控制按钮。

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

dependencies:
  flutter:
    sdk: flutter
  system_media_controller: ^x.y.z  # 请替换为最新版本号

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

接下来是一个简单的示例,展示如何使用system_media_controller来控制媒体播放:

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

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

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

class MediaControlScreen extends StatefulWidget {
  @override
  _MediaControlScreenState createState() => _MediaControlScreenState();
}

class _MediaControlScreenState extends State<MediaControlScreen> {
  late SystemMediaController _mediaController;

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

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

  void _initMediaController() {
    _mediaController = SystemMediaController(
      metadata: MediaMetadata(
        title: 'Demo Song',
        artist: 'Demo Artist',
        album: 'Demo Album',
        albumArtUri: Uri.parse('https://example.com/album_art.jpg'),
      ),
      actions: [
        MediaAction.play,
        MediaAction.pause,
        MediaAction.stop,
        MediaAction.skipToNext,
        MediaAction.skipToPrevious,
      ],
      playbackState: MediaPlaybackState(
        actions: [
          MediaAction.play,
          MediaAction.pause,
        ],
        state: MediaPlaybackState.playing,
        position: Duration(seconds: 0),
        bufferedPosition: Duration(seconds: 30),
        speed: 1.0,
        duration: Duration(seconds: 120),
      ),
      onMetadataChanged: (metadata) {
        // 处理元数据变化
      },
      onPlaybackStateChanged: (state) {
        // 处理播放状态变化
      },
      onPlay: () async {
        // 处理播放操作
        setState(() {
          _mediaController.updatePlaybackState(
            MediaPlaybackState(
              state: MediaPlaybackState.playing,
              position: _mediaController.playbackState.position + Duration(seconds: 1),
            ),
          );
        });
      },
      onPause: () async {
        // 处理暂停操作
        setState(() {
          _mediaController.updatePlaybackState(
            MediaPlaybackState(
              state: MediaPlaybackState.paused,
            ),
          );
        });
      },
      onStop: () async {
        // 处理停止操作
        setState(() {
          _mediaController.updatePlaybackState(
            MediaPlaybackState(
              state: MediaPlaybackState.stopped,
            ),
          );
        });
      },
      onSkipToNext: () async {
        // 处理跳到下一曲操作
        // 实现逻辑...
      },
      onSkipToPrevious: () async {
        // 处理跳到上一曲操作
        // 实现逻辑...
      },
      onSeekBackward: () async {
        // 处理向后跳转操作
        // 实现逻辑...
      },
      onSeekForward: () async {
        // 处理向前跳转操作
        // 实现逻辑...
      },
    );
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('System Media Controller Demo'),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            ElevatedButton(
              onPressed: () {
                _mediaController.play();
              },
              child: Text('Play'),
            ),
            ElevatedButton(
              onPressed: () {
                _mediaController.pause();
              },
              child: Text('Pause'),
            ),
            ElevatedButton(
              onPressed: () {
                _mediaController.stop();
              },
              child: Text('Stop'),
            ),
          ],
        ),
      ),
    );
  }
}

在这个示例中,我们创建了一个SystemMediaController实例,并设置了元数据、操作列表和初始播放状态。然后,我们定义了一些回调来处理各种媒体控制操作,比如播放、暂停和停止。

请注意,实际使用中,你可能需要根据具体的媒体播放器逻辑来更新播放状态,例如处理播放位置的变化等。这个示例仅展示了如何使用system_media_controller插件的基础功能。

回到顶部