Flutter Windows平台支持插件smtc_windows的使用

Flutter Windows平台支持插件smtc_windows的使用

SMTC_Windows

pub package

在Windows上实现SystemMediaTransportControls的Flutter插件。这是Android的audio_session和Linux的D-Bus MPRIS(媒体播放器远程接口规范)的等效实现。

安装

在你的pubspec.yaml文件中添加smtc_windows作为依赖项。

flutter pub add smtc_windows

要求

确保安装了rustup

支持此项目

使用

Future<void> main() async {
  WidgetsFlutterBinding.ensureInitialized();

  await SMTCWindows.initialize();
  runApp(const MyApp());
}

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

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

class _MyAppState extends State<MyApp> {
  late SMTCWindows smtc;

  [@override](/user/override)
  void initState() {
    // 初始化SMTC
    smtc = SMTCWindows(
      metadata: const MusicMetadata(
        title: 'Title',
        album: 'Album',
        albumArtist: 'Album Artist',
        artist: 'Artist',
        thumbnail: 
            'https://media.glamour.com/photos/5f4c44e20c71c58fc210d35f/master/w_2560%2Cc_limit/mgid_ao_image_mtv.jpg',
      ),
      // 时间轴信息供操作系统媒体播放器使用
      timeline: const PlaybackTimeline(
        startTimeMs: 0,
        endTimeMs: 1000,
        positionMs: 0,
        minSeekTimeMs: 0,
        maxSeekTimeMs: 1000,
      ),
      // 在操作系统媒体播放器中显示哪些按钮
      config: const SMTCConfig(
        fastForwardEnabled: true,
        nextEnabled: true,
        pauseEnabled: true,
        playEnabled: true,
        rewindEnabled: true,
        prevEnabled: true,
        stopEnabled: true,
      ),
    );
    WidgetsBinding.instance.addPostFrameCallback((_) async {
      try {
        // 监听按钮事件并相应地更新播放状态
        smtc.buttonPressStream.listen((event) {
          switch (event) {
            case PressedButton.play:
              // 更新播放状态
              smtc.setPlaybackStatus(PlaybackStatus.Playing);
              break;
            case PressedButton.pause:
              smtc.setPlaybackStatus(PlaybackStatus.Paused);
              break;
            case PressedButton.next:
              print('Next');
              break;
            case PressedButton.previous:
              print('Previous');
              break;
            case PressedButton.stop:
              smtc.setPlaybackStatus(PlaybackStatus.Stopped);
              smtc.disableSmtc();
              break;
            default:
              break;
          }
        });
      } catch (e) {
        debugPrint("Error: $e");
      }
    });
    super.initState();
  }

  [@override](/user/override)
  void dispose() {
    // 释放SMTC
    smtc.dispose();
    super.dispose();
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: const Text('Native Packages'),
        ),
        body: ElevatedButton(
          child: const Text("Click"),
          onPressed: () {
            // 更新播放器元数据
            smtc.updateMetadata(
              const MusicMetadata(
                title: 'Title',
                album: 'Album',
                albumArtist: 'Album Artist',
                artist: 'Artist',
                thumbnail: 
                    'https://media.glamour.com/photos/5f4c44e20c71c58fc210d35f/master/w_2560%2Cc_limit/mgid_ao_image_mtv.jpg',
              ),
            );
          },
        ),
      ),
    );
  }
}

更多关于Flutter Windows平台支持插件smtc_windows的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter Windows平台支持插件smtc_windows的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


smtc_windows 是一个用于在 Windows 平台上控制系统的媒体传输控制(System Media Transport Controls, SMTC)的 Flutter 插件。它允许你在 Flutter 应用程序中与 Windows 的媒体控件进行交互,例如显示当前播放的媒体信息、控制播放/暂停、下一首/上一首等操作。

使用 smtc_windows 插件的基本步骤

  1. 添加依赖
    pubspec.yaml 文件中添加 smtc_windows 插件的依赖:

    dependencies:
      flutter:
        sdk: flutter
      smtc_windows: ^1.0.0  # 请使用最新版本
    
  2. 导入插件
    在 Dart 文件中导入 smtc_windows 插件:

    import 'package:smtc_windows/smtc_windows.dart';
    
  3. 初始化 SMTC
    在使用 SMTC 之前,需要先初始化它:

    final smtc = SMTCWindows();
    smtc.initialize();
    
  4. 设置媒体信息
    你可以设置当前播放的媒体信息,例如标题、艺术家、专辑等:

    smtc.setMediaInfo(
      title: 'Song Title',
      artist: 'Artist Name',
      album: 'Album Name',
    );
    
  5. 控制播放状态
    你可以通过 SMTC 控制播放状态,例如播放、暂停、下一首、上一首等:

    smtc.play();
    smtc.pause();
    smtc.next();
    smtc.previous();
    
  6. 监听 SMTC 事件
    你可以监听 SMTC 的事件,例如用户点击了播放、暂停等按钮:

    smtc.onPlayPressed.listen((_) {
      print('Play button pressed');
      // 处理播放逻辑
    });
    
    smtc.onPausePressed.listen((_) {
      print('Pause button pressed');
      // 处理暂停逻辑
    });
    
    smtc.onNextPressed.listen((_) {
      print('Next button pressed');
      // 处理下一首逻辑
    });
    
    smtc.onPreviousPressed.listen((_) {
      print('Previous button pressed');
      // 处理上一首逻辑
    });
    
  7. 释放资源
    在应用程序退出时,记得释放 SMTC 的资源:

    smtc.dispose();
    

完整示例

以下是一个简单的示例,展示如何使用 smtc_windows 插件:

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

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

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

class _MyAppState extends State<MyApp> {
  final smtc = SMTCWindows();

  @override
  void initState() {
    super.initState();
    smtc.initialize();

    // 设置媒体信息
    smtc.setMediaInfo(
      title: 'My Song',
      artist: 'My Artist',
      album: 'My Album',
    );

    // 监听 SMTC 事件
    smtc.onPlayPressed.listen((_) {
      print('Play button pressed');
      // 处理播放逻辑
    });

    smtc.onPausePressed.listen((_) {
      print('Pause button pressed');
      // 处理暂停逻辑
    });

    smtc.onNextPressed.listen((_) {
      print('Next button pressed');
      // 处理下一首逻辑
    });

    smtc.onPreviousPressed.listen((_) {
      print('Previous button pressed');
      // 处理上一首逻辑
    });
  }

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

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('SMTC Windows Example'),
        ),
        body: Center(
          child: Column(
            mainAxisAlignment: MainAxisAlignment.center,
            children: [
              ElevatedButton(
                onPressed: () {
                  smtc.play();
                },
                child: Text('Play'),
              ),
              ElevatedButton(
                onPressed: () {
                  smtc.pause();
                },
                child: Text('Pause'),
              ),
              ElevatedButton(
                onPressed: () {
                  smtc.next();
                },
                child: Text('Next'),
              ),
              ElevatedButton(
                onPressed: () {
                  smtc.previous();
                },
                child: Text('Previous'),
              ),
            ],
          ),
        ),
      ),
    );
  }
}

注意事项

  • smtc_windows 插件仅支持 Windows 平台,因此在其他平台(如 Android、iOS)上运行时可能会出现问题。你可以使用 Platform.isWindows 来判断当前平台是否为 Windows,从而避免在其他平台调用相关代码。

    import 'dart:io';
    
    if (Platform.isWindows) {
      // Windows 平台相关代码
    }
回到顶部