我们必须enterPictureInPictureMode()将活动从其当前形式转移到画中画表示.
除了破坏活动之外,我们还原的方法是什么,将活动恢复到正常状态?没有exitPictureInPictureMode(),leavePictureInPictureMode()或janeGetMeOffThisCrazyPictureInPictureModeThing()方法Activity,文档似乎没有涵盖替代方案.
我对Android O的解决方案感兴趣,对于移动设备上的画中画模式,虽然如果它也适用于Android TV,太棒了!
更新2017-04-08:如果您想要的是当用户单击X按钮退出画中画模式时返回正常模式,您可以执行以下操作:
@Override
public void onPictureInPictureModeChanged(boolean isInPictureInPictureMode) {
super.onPictureInPictureModeChanged(isInPictureInPictureMode);
if (!isInPictureInPictureMode) {
getApplication().startActivity(new Intent(this, getClass())
.addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT));
}
}
Run Code Online (Sandbox Code Playgroud)
关键位是调用startActivity()再次启动当前活动FLAG_ACTIVITY_REORDER_TO_FRONT.对于singleTask活动,您需要在某些非Activity上下文中调用它,例如Application单例.这似乎没有触发onStop()或onStart(),但它确实触发onNewIntent()(无论Intent你传递给什么startActivity()).
有没有人在Android O的PiP模式下管理后台堆栈和任务有任何经验或建议?
进入PiP模式似乎将活动与当前任务堆栈分离.退出并不能恢复它.
Chrome浏览器似乎使用画中画在您输入画中画模式,可以浏览周围的其他应用程序,恢复PIP到全屏,然后按返回到最终回到网页时要正确处理回堆栈.当它处于PiP模式时,您也无法在任务列表中看到Chrome.是否有一些我缺少的东西,或Chrome是否正在做一些特殊的事情,或者可能只使用Tab和全屏视频的单一活动?
基本上我想要恢复整个应用程序,并且当我们从PiP回来时我们进入PiP的时候它是后筹码.
android multi-window android-8.0-oreo android-picture-in-picture
我在 Android O 手机(各种三星版本)上使用 PIP 模式,效果很好。但是,如果我打开辅助功能模式,我会得到
java.lang.IllegalStateException·enterPictureInPictureMode: Device doesn't support picture-in-picture mode
Run Code Online (Sandbox Code Playgroud)
进入画中画模式时。在进入 PIP 之前,我会检查 PackageManager.FEATURE_PICTURE_IN_PICTURE 以及 AppOpsManager.OPSTR_PICTURE_IN_PICTURE 是否已启用(两者都返回 true)。消息“设备不支持画中画模式”显然具有误导性和错误,但在这种情况下有没有办法检查 PIP 是否可用?
请注意,这似乎是三星唯一的问题,因为我尝试了各种三星手机和平板电脑(S8、Note 8、Tab S3、Tab S4),但它们都崩溃了。Google Pixel 3 手机没有这个问题。
我正在尝试在不停止 PIP 模式的情况下播放 YouTube 视频的画中画模式。但是视频在黑屏进入 PIP 时停止播放,即使手动调用 player.play() 方法也不会播放。我看到它工作的唯一方法是创建一个新的 Fragment 实例并再次 initialize() 。如何播放符合以下要求的视频?
- 进入 PIP 模式时,YouTube 视频应继续播放而不会停止/暂停
- newInstance() 丢失缓冲区 + 导致重新加载延迟,需要连续播放
- API 必须允许选择播放质量(“小”、“大”等)。所以 IFRAME API 不是一个选项
- 不应破坏 YouTube 的 TOS,因此其他支持 DASH 网址等的外部视频播放器看起来也不像是一个选项
- 最好 Activity 应该扩展 AppCompatActivity 而不是 YouTubeBaseActivity
注意:从 PIP 返回到完整模式时,视频会连续播放,没有问题。
尝试了以下方法:
- 尝试了不使用画中画的有界和无界服务,仍然连续播放是一个问题。
- Francesco 的 android youtube 播放器 API(视频可以无缝播放,但由于 YouTube 的 API 限制无法更改播放质量)
- 使用 YoutTubePlayerSupportFragment 在 Activity 和 Player 的 onPictureInPictureModeChanged()、onPause() 和 onStopped() 事件上手动调用 play()(视频不会播放,保持黑屏)
- 删除视图/布局并在 PIP 上尝试 YouTubePlayer.setFullscreen(true)
- 尝试在布局上仅使用一个空的 FrameLayout 来检查叠加层是否导致问题,否
- Android Studio 调试日志中也没有报告 Overlays 的错误
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto" …Run Code Online (Sandbox Code Playgroud) java android youtube-api android-youtube-api android-picture-in-picture
在Android PIP中使用浮动/半透明窗口会导致3秒钟的延迟以及缩放问题。我整理了一个示例应用程序来演示该问题。我在想我使用的标记组合不正确或完全缺少某些标记。我尝试了许多不同的组合,并提出了一些组合来演示该问题。我将添加代码部分以给您和我正在做什么的想法。我将根据需要添加其他或完整的代码。我想尽量简化这个问题,但可能要等到我添加更多示例应用程序后,您才能在开发环境中实际运行该应用程序。
以下是styles.xml中测试应用程序的重要部分:
<!--== ERROR CASE #1=================================-->
<!-- Causes 3 second delay to get into PIP mode -->
<!-- Incorrect window scale during 3 second delay -->
<!-- Incorrect window size after PIP exit -->
<!--=================================================-->
<item name="android:windowIsFloating">true</item>
<!--=================================================-->
<!--== ERROR CASE #2=================================-->
<!-- Causes 3 second delay to get into PIP mode-->
<!-- Window is not transparent -->
<!--=================================================-->
<item name="android:windowIsTranslucent">true</item>
<!--=================================================-->
<!--== ERROR CASE #3=================================-->
<!-- Causes 3 second delay to get into PIP mode -->
<!-- Incorrect …Run Code Online (Sandbox Code Playgroud) 我正在我的应用程序中使用画中画模式。事实上,它工作得很好,但我在瞬间闪烁/消失视频时遇到了问题。
我在“全屏”/正常模式下有 VideoActivity。我正在打电话enterPictureInPictureMode();并且Activity正在崩溃到小的画中画帧。在动画结束缩小布局的那一刻,视频会在一瞬间/一帧内变得透明。同样在这个框架中,整个画中画框架在(高度)下都有阴影。当我触摸这个小画中画帧时,它会扩展到大画中画帧(不是全屏)并且这个动画很流畅,但是当自动折叠到小画中画帧时它会在最后再次闪烁......每次Activity动画时到小画中画帧(无论是从大画中画帧还是全屏折叠Activity),当达到最终“小边界”时,会发生一帧透明闪烁。对声音无影响,视频播放稳定,无来电onPlayerStateChanged。
使用较新的 API 版本,我们可以创建有边界的动画,这就是我知道视频视图正在闪烁的方式......使用无属性方法使整个布局折叠,我只能在视频/播放器/表面视图(黑色条纹)区域看到闪烁上面和下面的视频)。当我使用较新的方法时,setSourceRectHint我可以看到整个画中画帧消失,而不考虑其父级的黑色背景。实际上,我添加了View具有固定大小、背景颜色centerInParent等的虚拟对象PlayerView- 当放置在(父级中的第一个)PlayerView层下方时,它会像玩家一样闪烁/隐藏,但放置在上方根本不闪烁,PlayerView即使在它上方显示消失一秒。
如何修复闪烁或设置黑色背景,而不是透明...
if (Build.VERSION.SDK_INT >= 26) {
Rect bounds = new Rect();
playerView.getVideoSurfaceView().getDrawingRect(bounds);
int toTop = (playerView.getMeasuredHeight() - bounds.height()) / 2,
toLeft = (playerView.getMeasuredWidth() - bounds.width()) / 2;
bounds.top += toTop;
bounds.left += toLeft;
bounds.bottom += toTop;
bounds.right += toLeft;
enterPictureInPictureMode(new PictureInPictureParams.Builder(). …Run Code Online (Sandbox Code Playgroud) android android-videoview exoplayer android-picture-in-picture
我需要做的是检测用户是否向下拖动 PIP 窗口(向下拖动以关闭)。当我这样做时,该onPictureInPictureModeChanged方法被调用
但是我如何才能检测到具体的解雇?
这是另一个例子:
从上面的屏幕截图中我们看到用户可以在图片模式下禁用图片。您可以在模拟器 api 27 的“特殊应用程序访问”屏幕中找到它。如何检测用户是否禁用了此功能?
我尝试检查以下内容但它不起作用:
packageManager.hasSystemFeature(PackageManager.FEATURE_PICTURE_IN_PICTURE)
Run Code Online (Sandbox Code Playgroud)
编译器指出找不到 AppOpsManager。有任何想法吗 ?
我遵循了Android 画中画文档。也就是说,我的画中画活性标记android:launchMode="singleTask",android:resizeableActivity="true"和android:configChanges="screenSize|smallestScreenSize|screenLayout|orientation"在清单。
画中画似乎效果很好。但是,我注意到一个案例,我遇到了不良行为。
当我的应用程序收到推送时,我创建了PendingIntent一个Intentfor MyActivity(Activity与 PiP不同Activity)。但是,当我点击通知并Intent使用时,MyActivity它会在画中画窗口内启动!
我已经尝试添加android:launchMode="singleTask"到MyActivity清单中。我也尝试添加该标志编程到Intent使用它与之前PendingIntent.getActivity()。这似乎不能解决问题。
谁能告诉我如何防止这种情况?
android android-intent android-pendingintent android-picture-in-picture
我有两个活动A和B,A活动有视频列表。单击视频后,将转到B(播放器)活动来播放视频。
面临的问题
A(视频列表)--> B(玩家活动)
当我点击后退按钮B活动进入 PIP 模式。现在A可见,B活动处于 PIP 模式(视频播放)。我再次单击后退按钮,它关闭了A活动,但B仍处于 PIP 模式。现在B活动将 PIP 模式保留为完整活动。
现在再次单击后退按钮,我想将A显示为 PIP 模式的后退堆栈B活动。但B活动进入 PIP 模式,但返回屏幕作为主屏幕。
当我在B活动中单击“主页”按钮时,B活动将进入 PIP 模式。PIP 中的B活动现在可以访问主屏幕。现在单击PIP模式屏幕即可完全活动。
现在再次单击后退按钮,我想将A显示为 PIP 模式的后退堆栈B活动。但B活动进入 PIP 模式,但返回屏幕作为主屏幕。
显现
<activity
android:name=".MainActivity"
android:screenOrientation="portrait"/>
<activity
android:name=".PlayerActivity"
android:allowTaskReparenting="true"
android:autoRemoveFromRecents="true"
android:configChanges="screenSize|smallestScreenSize|screenLayout|orientation|layoutDirection"
android:excludeFromRecents="true"
android:launchMode="singleTask"
android:resizeableActivity="true" …Run Code Online (Sandbox Code Playgroud) android ×10
android-picture-in-picture ×10
java ×2
exoplayer ×1
multi-window ×1
youtube-api ×1