我是新来的,所以请原谅,如果我不问正确的问题或张贴足够的信息。
我刚开始创建移动应用程序,我正在使用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(),但是我找不到如何做到这一点。有人能帮忙吗?我已经搜索了许多论坛几个星期,并最终放弃张贴一个问题。
发布于 2018-03-01 02:27:19
对于back按钮,只需重写当前OnBackButtonPressed页面的Xamarin.Forms:
public partial class MainPage : ContentPage
{
public MainPage()
{
InitializeComponent();
}
protected override bool OnBackButtonPressed()
{
//stop the videoview
videoview.Stop();
return base.OnBackButtonPressed();
}
...
}关于home按钮,我参考了这条线,并根据Jack的回答制作了HomeWatcher的Xamarin版本:
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
});
...
}
}https://stackoverflow.com/questions/49021859
复制相似问题