0

我想为一个流/网址创建一个流应用程序。

在 audio_service 示例中,在 AudioPlayerHandler 中添加了一个 MediaItem。

这很有效,但是当 IcyMedata 更新通知时……显然……有来自添加的 MediaItem 的标题和内容。在应用程序中,我可以根据 _audioHandler.playbackstate 和 _player.icyMetadata!.info!.title 进行更新!还有一些 sting.splits(' - ') 我可以使用 StreamBilder 更新应用程序中的信息。

还尝试了一种肮脏的技巧,通过更改 audio_service 在 PlaybackState 对象中添加标题,并添加标题作为属性,并在自定义 AudioHandler 中将其与 _player.icy ... 连接起来。

但是必须有一种适当的方法来设置新的元数据或由该框架本身设置。_audioHandler.updateMediaItem 到目前为止对通知信息什么也没做,这就是我需要的!

我找到了一个 addStream ......我的尝试(片段)

Stream<MediaItem> _item()  async* {   MediaItem(
      id: "http://stream.drumandbass.fm:9012",
      title: "TEST",
      artist: "Hello",
      album: "Album",
      duration: const Duration(milliseconds: 5739820),
      genre: 'Drum and Bass',
      artUri: Uri.parse('test.jpg'));
}

Future<AudioPlayerHandler> initAH() async {
  return await AudioService.init(
    builder: () => AudioPlayerHandler(),
    config: const AudioServiceConfig(
      androidNotificationChannelId: 'com.ryanheise.myapp.channel.audio',
      androidNotificationChannelName: 'Audio playback',
      androidNotificationOngoing: true,
    ),
  );
class AudioPlayerHandler extends BaseAudioHandler {
  /// Initialise our audio handler.
  AudioPlayerHandler() {
    // So that our clients (the Flutter UI and the system notification) know
    // what state to display, here we set up our audio handler to broadcast all
    // playback state changes as they happen via playbackState...
    _player.playbackEventStream.map(_transformEvent).pipe(playbackState);
    // ... and also the current media item via mediaItem.
    mediaItem.addStream(_item());
    // Load the player.
    _player.setAudioSource(AudioSource.uri(Uri.parse(mediaItem.value!.id)));
  }
 // some play stop the rest of the example of audio_service

小部件:

FutureBuilder<AudioPlayerHandler>(
                        future: initAH(),
                        builder: (BuildContext context,
                            AsyncSnapshot<AudioPlayerHandler> snapshot) {
                          if (!snapshot.hasData) {
                            // while data is loading:
                            return Center(
                              child: CircularProgressIndicator(),
                            );
                          } else {
                            _audioHandler = snapshot.data!;

                            loaded = true;

                            // data loaded:

                            return Container();
                          }
                        },
                      ),

… 使用 _player.add(MediaItem()); 就像在示例中一样,我得到了一个 snapshot.hasData 但加载的 addStream 保持为假。

我感谢任何提示以正确处理此问题。

谢谢,

汤姆

4

1 回答 1

0

因为你没有看到通知。请检查您的安卓配置。

<manifest xmlns:tools="http://schemas.android.com/tools" ...>
  <!-- ADD THESE TWO PERMISSIONS -->
  <uses-permission android:name="android.permission.WAKE_LOCK"/>
  <uses-permission android:name="android.permission.FOREGROUND_SERVICE"/>
  
  <application ...>
    
    ...
    
    <!-- EDIT THE android:name ATTRIBUTE IN YOUR EXISTING "ACTIVITY" ELEMENT -->
    <activity android:name="com.ryanheise.audioservice.AudioServiceActivity" ...>
      ...
    </activity>
    
    <!-- ADD THIS "SERVICE" element -->
    <service android:name="com.ryanheise.audioservice.AudioService"
        android:exported="true" tools:ignore="Instantiatable">
      <intent-filter>
        <action android:name="android.media.browse.MediaBrowserService" />
      </intent-filter>
    </service>

    <!-- ADD THIS "RECEIVER" element -->
    <receiver android:name="com.ryanheise.audioservice.MediaButtonReceiver"
        android:exported="true" tools:ignore="Instantiatable">
      <intent-filter>
        <action android:name="android.intent.action.MEDIA_BUTTON" />
      </intent-filter>
    </receiver> 
  </application>
</manifest>
于 2022-01-29T11:54:07.903 回答