Звук 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
});
...
}
}