首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Xamarin.Forms ViewRenderer音频不会停留在主页/后退按钮上

Xamarin.Forms ViewRenderer音频不会停留在主页/后退按钮上
EN

Stack Overflow用户
提问于 2018-02-28 04:13:57
回答 1查看 407关注 0票数 2

我是新来的,所以请原谅,如果我不问正确的问题或张贴足够的信息。

我刚开始创建移动应用程序,我正在使用Xamarin.Forms创建一个自定义视图。从这个角度来看,我使用了一个Android ViewRenderer来播放内置于android MediaPlayer/VideoView的音频/视频。

与android渲染器发布并被接受为复制并正在工作的渲染器的答案几乎完全相同。

我的问题是,当视频开始,你点击主页/后退按钮,音频继续播放几秒钟,然后停止。我想立刻停止播放。

我尝试过的方法:

在我的ViewRenderer中,我试图通过override SurfaceDestroyed调用player.stop()。这是不起作用的,没有错误或任何只是音频的继续,就像这段代码不存在一样。音频在大约3-5秒后停止。

ViewRenderer中,我尝试使用Control.SystemUiVisibilityChange事件来调用player.stop()。没有错误什么的。音频持续3-5秒.

我无法将player实例传递给主activity onPause()方法,就像我对Xamarin.Forms和AndroidViewRenderers新手一样,无法理解如何。可能会在player.stop()方法上调用这个onPause(),但是我找不到如何做到这一点。有人能帮忙吗?我已经搜索了许多论坛几个星期,并最终放弃张贴一个问题。

EN

回答 1

Stack Overflow用户

发布于 2018-03-01 02:27:19

对于back按钮,只需重写当前OnBackButtonPressed页面的Xamarin.Forms

代码语言:javascript
复制
public partial class MainPage : ContentPage
{
    public MainPage()
    {
        InitializeComponent();
    }

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

关于home按钮,我参考了这条线,并根据Jack的回答制作了HomeWatcher的Xamarin版本:

代码语言:javascript
复制
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() ):

代码语言:javascript
复制
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
        });

       ...
     }

  }
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49021859

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档