Звук Xamarin.Forms ViewRenderer не останавливается на домашней странице / кнопке

Я новичок, так что извините, если я не правильно задаю вопрос или публикую достаточно информации.

Я новичок в создании мобильных приложений, и я использую Xamarin.Forms создать собственный вид. с этой точки зрения я использую Android ViewRenderer играть аудио / видео со встроенным Android MediaPlayer/VideoView,

почти то же самое, что и рендерер для Android, опубликованный и принятый в качестве ответа для рендерера, который я скопировал и работает

Моя проблема в том, что когда видео начинается, и вы нажимаете домашнюю страницу / кнопку "Назад", аудио продолжает воспроизводиться в течение нескольких секунд, а затем останавливается. Я хочу, чтобы аудио немедленно прекратилось.

Методы, которые я попробовал:

В моем ViewRenderer Я пытался override SurfaceDestroyed звонить player.stop(), Это не сработало, никаких ошибок или чего-то другого, только аудио продолжается, как этот код не существует. Звук останавливается примерно через 3-5 секунд.

в ViewRenderer Я пытался использовать Control.SystemUiVisibilityChange событие, чтобы позвонить player.stop(), Нет ошибок или что-нибудь. Звук продолжается 3-5 секунд.

Я не могу пройти player экземпляр основной деятельности onPause() метод, как я новичок в Xamarin.Forms и андроид ViewRenderers чтобы понять как. Возможно, называя это player.stop() на onPause() метод будет работать, но я не могу найти, как это сделать. Кто-нибудь может помочь? Я искал много форумов в течение нескольких недель и, наконец, сдался, чтобы опубликовать вопрос.

1 ответ

Для кнопки возврата вам просто нужно переопределить OnBackButtonPressed вашего текущего Xamarin.Formsстраница:

public partial class MainPage : ContentPage
{
    public MainPage()
    {
        InitializeComponent();
    }

    protected override bool OnBackButtonPressed()
    {
        //stop the videoview
        videoview.Stop();
        return base.OnBackButtonPressed();
    }
   ...
}

Для домашней кнопки я сослался на эту ветку и сделал версию Xamarin HomeWatcher из ответа Джека:

public interface IOnHomePressedListener
{
    void OnHomePressed();
    void OnHomeLongPressed();
}

public class HomeWatcher
{
    static readonly String TAG = "hg";
    private Context mContext;
    private IntentFilter mFilter;
    private IOnHomePressedListener mListener;
    private InnerRecevier mRecevier;

    public HomeWatcher(Context context)
    {
        mContext = context;
        mFilter = new IntentFilter(Intent.ActionCloseSystemDialogs);
    }

    public void SetOnHomePressedListener(IOnHomePressedListener listener)
    {
        mListener = listener;
        mRecevier = new InnerRecevier(mListener);
    }

    public void StartWatch()
    {
        if (mRecevier != null)
        {
            mContext.RegisterReceiver(mRecevier, mFilter);
        }
    }

    public void StopWatch()
    {
        if (mRecevier != null)
        {
            mContext.UnregisterReceiver(mRecevier);
        }
    }


    private class InnerRecevier : BroadcastReceiver
    {
        readonly String SYSTEM_DIALOG_REASON_KEY = "reason";
        readonly String SYSTEM_DIALOG_REASON_GLOBAL_ACTIONS = "globalactions";
        readonly String SYSTEM_DIALOG_REASON_RECENT_APPS = "recentapps";
        readonly String SYSTEM_DIALOG_REASON_HOME_KEY = "homekey";
        IOnHomePressedListener _listener;

        public InnerRecevier(IOnHomePressedListener listener)
        {
            _listener = listener;
        }

        public override void OnReceive(Context context, Intent intent)
        {
            String action = intent.Action;
            if (action.Equals(Intent.ActionCloseSystemDialogs))
            {
                String reason = intent.GetStringExtra(SYSTEM_DIALOG_REASON_KEY);
                if (reason != null)
                {
                    //Log.e(TAG, "action:" + action + ",reason:" + reason);
                    if (_listener != null)
                    {
                        if (reason.Equals(SYSTEM_DIALOG_REASON_HOME_KEY))
                        {
                            _listener.OnHomePressed();
                        }
                        else if (reason.Equals(SYSTEM_DIALOG_REASON_RECENT_APPS))
                        {
                            _listener.OnHomeLongPressed();
                        }
                    }
                }
            }
        }
    }
}

И использовать его в VideoViewRenderer (StartWatch() когда начнется воспроизведение видео, StopWatch() когда видеообзор убирается):

public class VideoViewRenderer : ViewRenderer<VideoView, Android.Widget.VideoView>, ISurfaceHolderCallback,IOnHomePressedListener
{
    ...

    private MediaPlayer _player;

    private HomeWatcher _homeWatcher;



    public VideoViewRenderer(Context context) : base(context)
    {
        _context = context;
        _homeWatcher = new HomeWatcher(context);
        _homeWatcher.SetOnHomePressedListener(this);

    }

    protected override void OnElementChanged(ElementChangedEventArgs<CustomVideoViewDemo.VideoView> e)
    {
        base.OnElementChanged(e);


        e.NewElement.CleanAction = new Action(() =>
        {
            #region Clean video player action (player no more used)

            if (_player == null)
                return;
            //stop watch home button
            _homeWatcher.StopWatch();


            _player.Release();

            #endregion
        });



        e.NewElement.PlayAction = new Action(() =>
        {
            #region Play video if it was stopped


            if (_player == null)
                return;
            //start watch home button
            _homeWatcher.StartWatch();
            if (!_player.IsPlaying)
            {
                _player.Start();
            }

            #endregion
        });

       ...
     }

  }
Другие вопросы по тегам