///Setting data source for the player (can do buffring) private async Task setPlayerDataSourse() { try { await player.SetDataSourceAsync(MainActivity.AudioPath); var mFocusRequest = new AudioFocusRequestClass.Builder(AudioFocus.Gain) .SetAudioAttributes(mPlaybackAttributes) .SetAcceptsDelayedFocusGain(true) .SetWillPauseWhenDucked(true) .SetOnAudioFocusChangeListener(this) .Build(); var focusResult = audioManager.RequestAudioFocus(mFocusRequest); if (focusResult != AudioFocusRequest.Granted) { Console.WriteLine("Could not get audio focus"); } player.PrepareAsync(); } catch (System.Exception ex) { Console.WriteLine("Unable to start playback: " + ex); } }
private void SetAudioFocus(bool focused) { try { if (AudioManager == null) { AudioManager = (AudioManager)Application.Context.GetSystemService(Context.AudioService); } if (focused) { PreviousAudioMode = AudioManager.Mode; PreviousSpeakerphoneOn = AudioManager.SpeakerphoneOn; if (Build.VERSION.SdkInt >= BuildVersionCodes.O) { var playbackAttributes = new AudioAttributes.Builder() .SetUsage(AudioUsageKind.VoiceCommunication) .SetContentType(AudioContentType.Speech) .Build(); var focusRequest = new AudioFocusRequestClass.Builder(AudioFocus.Gain) .SetAudioAttributes(playbackAttributes) .SetAcceptsDelayedFocusGain(true) .SetOnAudioFocusChangeListener(this) .Build(); AudioManager.RequestAudioFocus(focusRequest); } else { #pragma warning disable 618 AudioManager.RequestAudioFocus(this, Stream.VoiceCall, AudioFocus.GainTransient); #pragma warning restore 618 } //Start by setting MODE_IN_COMMUNICATION as default audio mode. It is //required to be in this mode when playout and/or recording starts for //best possible VoIP performance. Some devices have difficulties with speaker mode //if this is not set. AudioManager.SpeakerphoneOn = TypeCall != TypeCall.Audio; //AudioManager.SpeakerphoneOn = false; AudioManager.Mode = Mode.InCommunication; } else { AudioManager.Mode = PreviousAudioMode; AudioManager.SpeakerphoneOn = PreviousSpeakerphoneOn; #pragma warning disable 618 AudioManager.AbandonAudioFocus(null); #pragma warning restore 618 } } catch (Exception e) { Console.WriteLine(e); } }
protected override void OnCreate(Bundle savedInstanceState) { var builder = new AudioFocusRequestClass.Builder(AudioFocus.Gain); base.OnCreate(savedInstanceState); SetContentView(Resource.Layout.activity_main); Android.Support.V7.Widget.Toolbar toolbar = FindViewById <Android.Support.V7.Widget.Toolbar>(Resource.Id.toolbar); SetSupportActionBar(toolbar); FloatingActionButton fab = FindViewById <FloatingActionButton>(Resource.Id.fab); fab.Click += FabOnClick; }
/// <summary> /// Intializes the player. /// </summary> public async Task Play() { if (mediaPlayer != null && this.MediaPlayerState == PlaybackStateCompat.StatePaused) { //We are simply paused so just start again mediaPlayer.Start(); this.UpdatePlaybackState(PlaybackStateCompat.StatePlaying); this.StartNotification(); //Update the metadata now that we are playing this.UpdateMediaMetadataCompat(); return; } if (mediaPlayer == null) { this.InitializePlayer(); } if (mediaSessionCompat == null) { this.InitMediaSession(); } if (mediaPlayer.IsPlaying) { this.UpdatePlaybackState(PlaybackStateCompat.StatePlaying); return; } try { MediaMetadataRetriever metaRetriever = new MediaMetadataRetriever(); await mediaPlayer.SetDataSourceAsync(this.ApplicationContext, Android.Net.Uri.Parse(audioUrl)); await metaRetriever.SetDataSourceAsync(audioUrl, new Dictionary <string, string>()); //x var focusResult = audioManager.RequestAudioFocus(this, Stream.Music, AudioFocus.Gain); var afrcb = new AudioFocusRequestClass.Builder(AudioFocus.Gain); afrcb.SetOnAudioFocusChangeListener(this); var focusResult = audioManager.RequestAudioFocus(afrcb.Build()); if (focusResult != AudioFocusRequest.Granted) { //could not get audio focus Console.WriteLine("Could not get audio focus"); } this.UpdatePlaybackState(PlaybackStateCompat.StateBuffering); mediaPlayer.PrepareAsync(); this.AquireWifiLock(); this.UpdateMediaMetadataCompat(metaRetriever); this.StartNotification(); byte[] imageByteArray = metaRetriever.GetEmbeddedPicture(); if (imageByteArray == null) { this.Cover = await BitmapFactory.DecodeResourceAsync(this.Resources, Resource.Drawable.album_art); } else { this.Cover = await BitmapFactory.DecodeByteArrayAsync(imageByteArray, 0, imageByteArray.Length); } } catch (Exception ex) { this.UpdatePlaybackState(PlaybackStateCompat.StateStopped); mediaPlayer.Reset(); mediaPlayer.Release(); mediaPlayer = null; //unable to start playback log error Console.WriteLine(ex); } }
public void Start() { if (_player != null) { Stop(); } _handler.Post(() => { try { var defaultBandwidthMeter = new DefaultBandwidthMeter(); var adaptiveTrackSelectionFactory = new AdaptiveTrackSelection.Factory(defaultBandwidthMeter); var defaultTrackSelector = new DefaultTrackSelector(adaptiveTrackSelectionFactory); _player = ExoPlayerFactory.NewSimpleInstance(_context, defaultTrackSelector); _player.AddListener(this); _player.PlayWhenReady = true; if (Build.VERSION.SdkInt >= BuildVersionCodes.O) { var audioFocusRequest = new AudioFocusRequestClass.Builder(AudioFocus.Gain) .SetOnAudioFocusChangeListener(this) .SetAudioAttributes(new AudioAttributes.Builder() .SetUsage(AudioUsageKind.Media) .SetContentType(AudioContentType.Music) .Build()) .Build(); if (_audioManager.RequestAudioFocus(audioFocusRequest) == AudioFocusRequest.Granted) { play(); } } else { #pragma warning disable CS0618 // Type or member is obsolete if (_audioManager.RequestAudioFocus(this, Stream.Music, AudioFocus.Gain) == AudioFocusRequest.Granted) { play(); } #pragma warning restore CS0618 // Type or member is obsolete } } catch (Exception ex) { //Log.Error(TAG, $"Could not start player: {ex.Message}"); //Log.Debug(TAG, ex.ToString()); Error?.Invoke(this, new RadioStationErrorEventArgs(ex)); IsPlaying = false; } }); void play() { var mediaUri = Android.Net.Uri.Parse(StreamUrl); var userAgent = Util.GetUserAgent(_context, "wzxv.app.radio.player"); var defaultHttpDataSourceFactory = new DefaultHttpDataSourceFactory(userAgent); var defaultDataSourceFactory = new DefaultDataSourceFactory(_context, null, defaultHttpDataSourceFactory); var mediaSourceFactory = new ExtractorMediaSource.Factory(defaultDataSourceFactory); var mediaSource = mediaSourceFactory.CreateMediaSource(mediaUri); _player.Prepare(mediaSource); IsPlaying = true; } }