Flutter音频房间管理插件on_audio_room的使用

Flutter音频房间管理插件on_audio_room的使用

Pub.dev Platforms Flutter

on_audio_room 是一个用于创建存储音频部分(如收藏夹、内部播放列表、最常播放等)的“房间”的 Flutter 包。

该包作为 on_audio_query 的扩展工作,某些方法需要它。

帮助

如有任何问题,请在 GitHub issues 提交。 如有任何建议,请在 GitHub pull requests 提交。

翻译

请注意,您可以自由帮助进行 readme 翻译。

主题

如何安装

在您的 pubspec.yaml 文件中添加以下代码:

dependencies:
  on_audio_room: ^2.2.1+1

一些功能

  • 收藏夹部分
  • 最近播放部分
  • 最常播放部分
  • 内部播放列表部分

待办事项

  • 提高所有插件的性能。
  • 添加功能。
  • 修复错误。

如何使用

在调用任何方法之前,您需要初始化房间/房间:

void main() async {
  // 初始化一个房间
  await OnAudioRoom().initRoom(RoomType.FAVORITES); // 添加 RoomType
  runApp(MaterialApp(home: MyApp()));
}

// 或者

void main() async {
  // 初始化所有房间
  await OnAudioRoom().initRoom(); // 不要添加 RoomType
  runApp(MaterialApp(home: MyApp()));
}

重要提示:

  • 此方法只有在使用 async/await 时才能 100% 工作,否则小部件将在几乎相同的时间加载并抛出错误。
  • 记得在 dispose 中关闭房间。
  • 查看 文档
OnAudioRoom() // 启动插件的主要方法

房间方法

方法名 参数 返回值
initRoom RoomType, SubDir? bool
closeRoom bool
deleteRoomFile bool
getRoomInfo RoomEntity
clearAll bool

全局方法

方法名 参数 返回值
addTo RoomType, Entity, PlaylistKey? int?
addAllTo RoomType, Entity, PlaylistKey? List<int>
updateRoom RoomType, Entity bool
deleteFrom RoomType, EntityKey, PlaylistKey? bool
deleteAllFrom RoomType, EntityKeys, PlaylistKey? bool
clearRoom RoomType bool
checkIn RoomType, EntityKey, PlaylistKey? bool

查询方法

方法名 参数 返回值
queryFromFavorites EntityKey FavoritesEntity
queryFavorites Limit?, Reverse?, RoomSortType? List<FavoritesEntity>
queryFromLastPlayed EntityKey LastPlayedEntity
queryLastPlayed Limit?, Reverse?, RoomSortType? List<LastPlayedEntity>
queryFromMostPlayed EntityKey MostPlayedEntity
queryMostPlayed Limit?, Reverse?, RoomSortType? List<MostPlayedEntity>
queryFromPlaylist PlaylistKey, EntityKey SongEntity
queryAllFromPlaylist PlaylistKey, Limit?, Reverse?, RoomSortType? List<SongEntity>

播放列表方法

方法名 参数 返回值
createPlaylist PlaylistName int?
deletePlaylist PlaylistKey bool
renamePlaylist PlaylistKey, NewName bool
clearPlaylists bool
queryPlaylist PlaylistKey PlaylistEntity
queryPlaylists Limit?, Reverse? List<PlaylistEntity>

示例

所有示例将使用 [on_audio_query] 插件来获取歌曲/音频信息

addTo

  // 如果你使用 `[on_audio_query]`,只需扩展 SongModel 来创建任何实体。
  someName() async {
    // 返回将是歌曲在房间中的 ID。
    int? addToResult = await OnAudioRoom().addTo(
      RoomType.FAVORITES, 
      entity[index].getMap.toFavoritesEntity(),
    );
  }

  // 如果你不使用 `[on_audio_query]`,只需创建一个包含所有信息的 Map。
  someOtherName() async {
    Map<dynamic, dynamic> favoritesEntity = {
      "_data": song.data,
      "_display_name": song.displayName,
      "_id": song.id,
      "album": song.album,
      "album_id": song.albumId,
      "artist": song.artist,
      "artist_id": song.artistId,
      "date_added": song.dateAdded,
      "duration": song.duration,
      "title": song.title,
      "artwork": song.artwork,
    };

    // 现在,将其添加到房间中。
    // 返回将是歌曲在房间中的键。
    int? addToResult = await OnAudioRoom().addTo(
      RoomType.FAVORITES, 
      favoritesEntity.toFavoritesEntity(),
    ); 
  }

addAllTo

  // 如果你使用 `[on_audio_query]`,只需扩展 SongModel 来创建任何实体。
  someName() async {
    // 创建一个包含所有 SongModel 的列表。
    List<SongModel> listOfSongs;
    List<dynamic> listOfEntities;
    
    // 将所有歌曲从模型添加到实体。
    listOfSongs.forEach((element) {
      listOfEntities.add(element.getMap.toFavoritesEntity());
    });

    // 现在,将其添加到房间中。
    // 返回将是一个包含歌曲在房间中的 ID 的列表。
    List<int> addAllToResult = await OnAudioRoom().addAllTo(
      RoomType.FAVORITES, 
      listOfEntities,
      // playlistKey,
    );
  }

  // 如果你不使用 `[on_audio_query]`,只需创建一个包含所有信息的 Map 列表。
  someOtherName() async {
    List<dynamic> listOfEntities;

    listOfSongs.forEach((element) {
      Map<dynamic, dynamic> favoritesEntity = {
      "last_data": song.data,
      "display_name": song.displayName,
      "id": song.id,
      "album": song.album,
      "album_id": song.albumId,
      "artist": song.artist,
      "artist_id": song.artistId,
      "date_added": song.dateAdded,
      "duration": song.duration,
      "title": song.title,
      "artwork": song.artwork,
      };

      listOfEntities.add(favoritesEntity.toFavoritesEntity());
    });

    // 现在,将其添加到房间中。
    // 返回将是一个包含歌曲在房间中的 ID 的列表。
    List<int> addAllToResult = await OnAudioRoom().addAllTo(
      RoomType.FAVORITES, 
      favoritesEntity,
      // playlistKey,
    ); 
  }

deleteFrom

  someName() async {
    // 如果歌曲已删除,返回为 [true],否则为 [false]。
    bool deleteFromResult = await OnAudioRoom().deleteFrom(
      RoomType.FAVORITES,
      EntityKey,
      // playlistKey,
    );
  }

  // 当向播放列表添加/删除/检查歌曲时,记得添加 [PlaylistKey],否则会抛出异常。
  someName() async {
    // 如果歌曲已删除,返回为 [true],否则为 [false]。
    bool deleteFromResult = await OnAudioRoom().deleteFrom(
      RoomType.PLAYLIST,
      EntityKey,
      PlaylistKey: PlaylistKey,
    );
  }

deleteAllFrom

  someName() async {
    List<int> listOfKeysToDelete = [...];
    // 如果所有歌曲已删除,返回为 [true],否则为 [false]。
    bool deleteAllFromResult = await OnAudioRoom().deleteAllFrom(
      RoomType.FAVORITES,
      listOfKeysToDelete,
      // playlistKey,
    );
  }

clearRoom

  // 这个方法非常简单。
  someName() async {
    // 如果所有歌曲已删除,返回为 [true],否则为 [false]。
    bool deleteAllFromResult = await OnAudioRoom().clearRoom(
      RoomType.FAVORITES,
      // playlistKey,
    );
  }

checkIn

  // 使用此方法来检查某个歌曲是否已添加。
  // 为什么?如果你尝试两次添加同一首歌,它仍然可以工作。为了避免这种情况,检查是否存在。
  someName() async {
    // 如果歌曲已添加,返回为 [true],否则为 [false]。
    bool checkInResult = await OnAudioRoom().checkIn(
      RoomType.FAVORITES,
      EntityKey,
      // playlistKey,
    );
  }

queryFromFavorites

  someName() async {
    // 使用此方法定义一个键,并将返回关于此收藏歌曲的所有信息。
    FavoritesEntity? queryFromResult = await OnAudioRoom().queryFromFavorites(
      EntityKey,
    );
  }

queryFavorites

  someName() async {
    // 使用此方法根据类型 [Entity] 获取所有歌曲及其所有信息。
    //
    // 可以添加一个 [int] 参数来定义此查询将返回多少首歌曲。
    // 可以添加一个 [bool] 参数来定义列表是否反转。
    // 可以添加一个 [RoomSortType] 参数来定义列表的排序类型。
    List<FavoritesEntity> queryResult = await OnAudioRoom().queryFavorites(
      100, // 默认:50
      true, // 默认:false
      RoomSortType.TITLE // 默认:null
    );
  }

更多关于Flutter音频房间管理插件on_audio_room的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

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


当然,我可以为你提供一个关于如何使用Flutter中的on_audio_room插件进行音频房间管理的代码示例。on_audio_room插件通常用于在Flutter应用中实现音频聊天室的功能。请注意,实际使用时你需要确保已经将该插件添加到你的pubspec.yaml文件中。

以下是一个简单的代码示例,展示如何使用on_audio_room插件进行音频房间的管理:

1. 添加依赖

首先,在你的pubspec.yaml文件中添加on_audio_room插件的依赖:

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

2. 导入插件并初始化

在你的Flutter项目的Dart文件中导入on_audio_room插件,并进行初始化:

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

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Audio Room Management',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: AudioRoomPage(),
    );
  }
}

class AudioRoomPage extends StatefulWidget {
  @override
  _AudioRoomPageState createState() => _AudioRoomPageState();
}

class _AudioRoomPageState extends State<AudioRoomPage> {
  final OnAudioRoom _onAudioRoom = OnAudioRoom();

  @override
  void initState() {
    super.initState();
    // 初始化插件,例如设置房间ID和监听事件
    _onAudioRoom.init({
      'roomId': 'your_room_id',  // 替换为你的房间ID
      'userId': 'your_user_id',  // 替换为你的用户ID
    });

    // 监听房间状态变化
    _onAudioRoom.onRoomStateChanged.listen((event) {
      print('Room state changed: ${event.state}');
      if (event.state == RoomState.CONNECTED) {
        // 房间连接成功后的操作
      } else if (event.state == RoomState.DISCONNECTED) {
        // 房间断开连接后的操作
      }
    });

    // 监听用户列表变化
    _onAudioRoom.onUserListChanged.listen((event) {
      print('User list changed: ${event.users}');
    });

    // 监听音频流变化
    _onAudioRoom.onAudioStreamChanged.listen((event) {
      print('Audio stream changed: ${event.userId} - ${event.isSpeaking}');
    });
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Audio Room Management'),
      ),
      body: Padding(
        padding: const EdgeInsets.all(8.0),
        child: Column(
          children: [
            ElevatedButton(
              onPressed: () {
                // 加入房间
                _onAudioRoom.joinRoom();
              },
              child: Text('Join Room'),
            ),
            ElevatedButton(
              onPressed: () {
                // 离开房间
                _onAudioRoom.leaveRoom();
              },
              child: Text('Leave Room'),
            ),
            ElevatedButton(
              onPressed: () {
                // 开始说话
                _onAudioRoom.startSpeaking();
              },
              child: Text('Start Speaking'),
            ),
            ElevatedButton(
              onPressed: () {
                // 停止说话
                _onAudioRoom.stopSpeaking();
              },
              child: Text('Stop Speaking'),
            ),
          ],
        ),
      ),
    );
  }
}

enum RoomState {
  CONNECTING,
  CONNECTED,
  DISCONNECTING,
  DISCONNECTED,
}

注意事项

  1. 权限管理:确保在AndroidManifest.xmlInfo.plist中添加了必要的音频和网络权限。
  2. 错误处理:实际应用中应添加错误处理逻辑,以处理可能出现的异常情况。
  3. UI优化:根据需求调整UI布局和样式,以适应不同的设备和屏幕尺寸。

上述代码展示了如何使用on_audio_room插件进行基本的音频房间管理操作,包括加入房间、离开房间、开始说话和停止说话等。根据具体需求,你可以进一步扩展和优化该代码。

回到顶部