我在我的应用程序中使用YoutubePlayerSupportFragment
。我正在添加YouTubePlayer.FULLSCREEN_FLAG_CUSTOM_LAYOUT
标志。从documentation我知道我的播放器在退出全屏后不会被拒绝,但现在我必须处理动作栏和导航栏。但是文档并没有说明或指出我如何处理这些案件。
现在我遇到的问题到目前为止只出现在华硕Nexus 7 OS 5.1.1中。我还有LG G2 D802 OS 4.4.2,三星Galaxy TAB GT P5113 OS 4.4.2和三星Galaxy Tab SM-T310 OS 4.2.2,它们不会抛出Overlay Error。在Log cat中,我收到以下消息。
03-09 15:54:39.760 11203-11203/com.jadoo.jadooplus W/YouTubeAndroidPlayerAPI﹕
YouTube video playback stopped due to unauthorized overlay on top of player.
The YouTubePlayerView is obscured by android.view.View{c067400 V.ED.... ........ 0,736-1280,800 #1020030 android:id/navigationBarBackground}.
Top edge 24 px above YouTubePlayerView's bottom edge. .
所以我知道导航栏中的 问题。导航栏覆盖在播放器顶部。
我的问题是这些
我尝试了点击事件但是在全屏模式下我无法获得任何内容我在活动中尝试了Overriding
dispatchTouchEvent()
并获得了我自己的点击事件,但即便如此&# 39;帮我摆脱导航栏的时间(实际上是在时间之前)。
我还尝试通过OnSystemUiVisibilityChangeListener
监听系统UI更改并隐藏导航栏(但可能还为时过早隐藏导航栏)。
我在Android清单文件中设置了android:theme="@style/Theme.AppCompat.NoActionBar"
,因此我并不需要隐藏导航栏中的操作/状态栏。
此外,如果任何人都可以确认它是特定于设备的问题,那么它将是一个很好的帮助。
答案 0 :(得分:0)
所以这就是解决这个问题的方法(这仍然不是一个解决方案,但它是我能找到的最接近的方法)。
所以,我在OnSystemUiChangeListener
onInitializationSuccess
(或YoutubePlayerSupportFragment
)YoutubePlayerFragment
中添加了(View) getView().getParent().setOnSystemUiVisibilityChangeListener();
。
OnSystemUiChangeListener
提供onSystemUiVisibilityChange()
。
覆盖方法@Override
public void onSystemUiVisibilityChange(int visibility) {
if (visibility == View.SYSTEM_UI_FLAG_VISIBLE) {
scheduleNavigationBarHide();
}
else if (visibility == View.SYSTEM_UI_FLAG_HIDE_NAVIGATION || visibility == View.SYSTEM_UI_FLAG_LOW_PROFILE
|| visibility == View.SYSTEM_UI_FLAG_FULLSCREEN) {
if (navigationBarHandler != null) {
navigationBarHandler.cancel();
navigationBarHandler.purge();
navigationBarHandler = null;
}
}
}
,如下所示:
private void scheduleNavigationBarHide() {
if (navigationBarHandler != null) {
Log.d(TAG, "Canceling navigationBarHandler.");
navigationBarHandler.cancel();
navigationBarHandler.purge();
navigationBarHandler = null;
}
if (mContext != null && mContext instanceof JadooTVActivity) {
navigationBarHandler = new Timer();
navigationBarHandler.schedule(new TimerTask() {
public void run() {
((JadooTVActivity) mContext).runOnUiThread(new Runnable() {
@Override
public void run() {
if (!isPlayerSqueezed) {
hideAsImmersiveNavigationBar(Config.context);
}
else {
Utils.showNavigationBar(Config.context);
}
}
});
}
}, 500);
}
}
提供方法scheduleNavigationBarHide()的定义。
hideAsImmersiveNavigationBar()
所以最后Navigation Bar
因为你可能已经猜到这是有用的,让private void hideAsImmersiveNavigationBar(Activity activity) {
if(activity != null)
{ View decorView = activity.getWindow().getDecorView();
int uiOptions = View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
| View.SYSTEM_UI_FLAG_FULLSCREEN | View.SYSTEM_UI_FLAG_IMMERSIVE;
decorView.setSystemUiVisibility(uiOptions);
}
}
暂时沉浸其中。这是
Navigation Bar
稍后当玩家关闭时,你可能想要带回int uiOptions = View.SYSTEM_UI_FLAG_VISIBLE | View.SYSTEM_UI_FLAG_FULLSCREEN;
。将UI标志更改为Navigation Bar
最后一点免责声明:我提供了应用程序已经过测试的设备列表,我不知道这是否适用于所有设备。如果您确实找到了问题持续存在的设备,请随时发表评论。此外,还在API 19中添加了沉浸式模式,因此该解决方案在此之前无法在任何设备上运行,但我只在一台运行API 21的设备上遇到此问题。所有旧设备都运行良好。此外,当<Window x:Class="WpfApplication2.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:WpfApplication2"
mc:Ignorable="d"
Title="MainWindow" Height="350" Width="525">
<Window.Resources>
<Storyboard x:Key="OnMouseDown1">
<DoubleAnimation Storyboard.TargetProperty="Width" Storyboard.TargetName="viewbox"
From="{Binding ElementName=viewbox, Path=ActualWidth}"
To="0"
Duration="0:0:1">
</DoubleAnimation>
</Storyboard>
</Window.Resources>
<Window.Triggers>
<EventTrigger RoutedEvent="UIElement.MouseDown" SourceName="ellipse">
<BeginStoryboard Storyboard="{StaticResource OnMouseDown1}"/>
</EventTrigger>
</Window.Triggers>
<Viewbox x:Name="viewbox">
<Ellipse x:Name="ellipse" Width="100" Height="100" Fill="Red"></Ellipse>
</Viewbox></Window>
停留1秒钟时,我们仍会收到重叠错误。
答案 1 :(得分:0)
当youtube全屏时,将活动更改为全屏。
void toggleFullScreen(boolean goFullScreen){
if(goFullScreen){
getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);
getWindow().clearFlags(WindowManager.LayoutParams.FLAG_FORCE_NOT_FULLSCREEN);
}else{
getWindow().addFlags(WindowManager.LayoutParams.FLAG_FORCE_NOT_FULLSCREEN);
getWindow().clearFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);
}
yourView.requestLayout();
}