public override void OnCreate() { base.OnCreate(); // Create a MediaSessionCompat mMediaSession = new MediaSessionCompat(ApplicationContext, LogTag); // Enable callbacks from MediaButtons and TransportControls mMediaSession.SetFlags( MediaSessionCompat.FlagHandlesMediaButtons | MediaSessionCompat.FlagHandlesTransportControls); // Set an initial PlaybackState with ACTION_PLAY, so media buttons can start the player mStateBuilder = new PlaybackStateCompat.Builder() .SetActions( PlaybackStateCompat.ActionPlay | PlaybackStateCompat.ActionPause); mMediaSession.SetPlaybackState(mStateBuilder.Build()); // MySessionCallback() has methods that handle callbacks from a media controller mMediaSession.SetCallback(new MySessionCallback()); // Set the session's token so that client activities can communicate with it. SessionToken = mMediaSession.SessionToken; }
private void UpdatePlaybackState(int state) { if (_mediaSessionCompat != null && _player != null) { try { PlaybackStateCompat.Builder stateBuilder = new PlaybackStateCompat.Builder() .SetActions( PlaybackStateCompat.ActionPause | PlaybackStateCompat.ActionPlay | PlaybackStateCompat.ActionPlayPause | PlaybackStateCompat.ActionSkipToNext | PlaybackStateCompat.ActionSkipToPrevious | PlaybackStateCompat.ActionStop ) .SetState(state, (long)_player?.CurrentPosition, 1.0f, SystemClock.ElapsedRealtime()); _mediaSessionCompat.SetPlaybackState(stateBuilder.Build()); if (state == PlaybackStateCompat.StatePlaying || state == PlaybackStateCompat.StatePaused) { StartNotification(); } } catch (Exception e) { System.Diagnostics.Debug.WriteLine(e); } } }
private void SetMediaPlaybackState(int state) { PlaybackStateCompat.Builder playbackstateBuilder = new PlaybackStateCompat.Builder(); if (state == PlaybackStateCompat.StatePlaying) { playbackstateBuilder.SetActions(PlaybackStateCompat.ActionPlayPause | PlaybackStateCompat.ActionPause | PlaybackStateCompat.ActionSkipToNext | PlaybackStateCompat.ActionSkipToPrevious | PlaybackStateCompat.ActionPlayFromMediaId | PlaybackStateCompat.ActionPlayFromSearch | PlaybackStateCompat.ActionPlayFromUri | PlaybackStateCompat.ActionPlay); playbackstateBuilder.SetState(state, PlaybackStateCompat.PlaybackPositionUnknown, 1.0f); } else { playbackstateBuilder.SetActions(PlaybackStateCompat.ActionPlayPause | PlaybackStateCompat.ActionPlay | PlaybackStateCompat.ActionSkipToNext | PlaybackStateCompat.ActionSkipToPrevious | PlaybackStateCompat.ActionPlayFromMediaId | PlaybackStateCompat.ActionPlayFromSearch | PlaybackStateCompat.ActionPlayFromUri | PlaybackStateCompat.ActionPause); playbackstateBuilder.SetState(state, PlaybackStateCompat.PlaybackPositionUnknown, 0); } mediaSessionCompat.SetPlaybackState(playbackstateBuilder.Build()); }
private void CreateMediaSession() { mediaSessionCompatCallback = new MediaSessionCompatCallbacks(this); mediaSessionCompat = new MediaSessionCompat(context, channelId); Android.Support.V4.Media.MediaMetadataCompat.Builder mediaMetadataCompat = new Android.Support.V4.Media.MediaMetadataCompat.Builder(); mediaMetadataCompat.PutString(Android.Support.V4.Media.MediaMetadataCompat.MetadataKeyArtist, AppResources.UnknownArtist); mediaMetadataCompat.PutString(Android.Support.V4.Media.MediaMetadataCompat.MetadataKeyTitle, AppResources.UnknownTitle); mediaSessionCompat.SetMetadata(mediaMetadataCompat.Build()); mediaSessionCompat.SetMediaButtonReceiver(PendingIntent.GetBroadcast(context, 5, mediaButtonReceiverIntent, PendingIntentFlags.CancelCurrent)); //TODO: Not working playbackStateCompat = new PlaybackStateCompat.Builder().SetActions(PlaybackStateCompat.ActionStop | PlaybackStateCompat.ActionPlay | PlaybackStateCompat.ActionPause | PlaybackStateCompat.ActionPlayPause | PlaybackStateCompat.ActionSkipToNext | PlaybackStateCompat.ActionSkipToPrevious) .SetState(PlaybackStateCompat.StateBuffering, PlaybackStateCompat.PlaybackPositionUnknown, 0) .Build(); mediaPlayer = MediaPlayer.Create(context, Resource.Raw.silence); mediaPlayer.Start(); mediaSessionCompat.SetPlaybackState(playbackStateCompat); mediaSessionCompat.SetCallback(mediaSessionCompatCallback); mediaSessionCompat.Active = true; }
public static async void UpdateChromecastNotification(string title, string body, bool isPaused, string poster, long time, long duration) { try { //new Android.Support.V4.Media.Session.MediaControllerCompat. var builder = new AndroidX.Core.App.NotificationCompat.Builder(Application.Context); builder.SetContentTitle(title); builder.SetContentText(body); builder.SetAutoCancel(false); builder.SetSmallIcon(Resource.Drawable.round_cast_white_48dp2_4); builder.SetOngoing(true); var context = MainActivity.activity.ApplicationContext; if (Build.VERSION.SdkInt >= BuildVersionCodes.O) { var channelId = $"{PkgName}.general"; var channel = new NotificationChannel(channelId, "General", NotificationImportance.Default); NotManager.CreateNotificationChannel(channel); builder.SetChannelId(channelId); //https://m.media-amazon.com/images/M/MV5BMTczNTI2ODUwOF5BMl5BanBnXkFtZTcwMTU0NTIzMw@@._V1_UX182_CR0,0,182,268_AL_.jpg var bitmap = await GetImageBitmapFromUrl(poster); //"https://m.media-amazon.com/images/M/MV5BMTczNTI2ODUwOF5BMl5BanBnXkFtZTcwMTU0NTIzMw@@._V1_UX182_CR0,0,182,268_AL_.jpg"); if (bitmap != null) { builder.SetLargeIcon(bitmap); } var stateBuilder = new PlaybackStateCompat.Builder() .SetActions(PlaybackStateCompat.ActionSeekTo | PlaybackStateCompat.ActionPause | PlaybackStateCompat.ActionPlay | PlaybackStateCompat.ActionStop) .SetState( isPaused ? PlaybackStateCompat.StatePaused : PlaybackStateCompat.StatePlaying, time, 1f, SystemClock.ElapsedRealtime() ); mediaSession.SetPlaybackState(stateBuilder.Build()); mediaSession.SetFlags(MediaSessionCompat.FlagHandlesMediaButtons | MediaSessionCompat.FlagHandlesTransportControls); mediaSession.SetMetadata(new Android.Support.V4.Media.MediaMetadataCompat.Builder() //.PutString(MediaMetadata.MetadataKeyArtist, "title") //.PutString(MediaMetadata.MetadataKeyTitle, "genre") .PutLong(MediaMetadata.MetadataKeyDuration, duration) //Negative duration means the duration is unknown // .PutString(MediaMetadata.MetadataKeyArt, "https://homepages.cae.wisc.edu/~ece533/images/peppers.png") .Build()); builder.SetColor(Android.Graphics.Color.Black.ToArgb()); // THIS IS VERY IMPORTANT FOR THE APPERANCE OF THE SEEKBAR IN THE NOTIFICATION builder.SetColorized(true); mediaSession.Active = true; // mediaSession.SetMetadata(new Android.Support.V4.Media.MediaMetadataCompat() { Description = new Android.Support.V4.Media.MediaDescriptionCompat() { } }) List <string> actionNames = new List <string>() { "-30s", isPaused ? "Play" : "Pause", "+30s", "Stop" }; List <int> sprites = new List <int>() { Resource.Drawable.netflixGoBack128, isPaused ? Resource.Drawable.netflixPlay128v2 : Resource.Drawable.netflixPause128v2, Resource.Drawable.netflixGoForward128, Resource.Drawable.netflixStop128v2 }; List <string> actionIntent = new List <string>() { "goback", isPaused ? "play" : "pause", "goforward", "stop" }; // next for (int i = 0; i < sprites.Count; i++) { var _resultIntent = new Intent(context, typeof(ChromeCastIntentService)); _resultIntent.PutExtra("data", actionIntent[i]); var _pending = PendingIntent.GetService(context, 2337 + i, _resultIntent, PendingIntentFlags.UpdateCurrent ); builder.AddAction(new AndroidX.Core.App.NotificationCompat.Action(sprites[i], actionNames[i], _pending)); } builder.SetStyle(new NotificationCompat.MediaStyle().SetMediaSession(mediaSession.SessionToken).SetShowActionsInCompactView(0, 1, 2)); // NICER IMAGE } builder.SetContentIntent(GetCurrentPending("openchrome")); try { NotManager.Notify(CHROME_CAST_NOTIFICATION_ID, builder.Build()); } catch (Exception _ex) { print("EX NOTTIFY;; " + _ex); } } catch (Exception _ex) { error(_ex); } }