这几天都在折腾 Delphi FireMonkey MediaPlayer 在安卓下的问题。
查源代码,这个 MediaPlayer 也是封装了安卓的 MediaPlayer,播放界面使用了安卓的 View 。
人生就是打怪过关。这里好多关,最后还是过不了:
1. 上一篇文章里提到的,第一次播放后,关闭 MediaPlayer,然后给它设置新的视频文件名,然后播放,却播放不起来的问题。通过使用 Timer 后来我使用 TTask.Run 的线程,将启动播放的代码,在线程里面,加上 Sleep 的等待,问题解决了。算是绕过去了。过了一关。
2. 原本是在一个 Form 里面放 MediaPlayer,需要播放的地方,调用这个 Form,弹出这个 Form 然后启动播放。用户可以点 Form 上的按钮停止播放,关闭 Form。这样在架构上比较好,相当于把 MediaPlayer 封装到一个 Form 里面去。任何地方需要播放视频,调用这个 Form 就好了。然后发现一个严重问题:播放视频后,用户点击 Form 上的按钮,关闭 Form,回退到上一层界面后,上一层界面倒是显示出来了,但手指触摸点击界面里的元素,不响应了。仔细观察,就是播放视频时,视频窗口覆盖位置的界面元素不响应手指点击。视频窗口没有覆盖到的部分,没有这问题。我这里说的视频窗口覆盖的位置是指屏幕范围,这时候视频窗口已经关闭不存在了。我把 MediaPlayer 释放掉也没解决这个问题。
2.1. 后来发现,如果把 MediaPlayerControl 放到一个 TabItem 里面,切换 TabItem 的方式,关闭当前视频回到上一层界面,仅仅是切换一下 TabItem,不会导致上一层界面中的元素不响应点击。算是过了一关。
3. 视频播放,要实现横屏和竖屏的切换。切换倒是可以切换,切换为横屏以后,再切换回竖屏,界面卡住,好半天才刷新正常,然后界面元素不响应点击的问题再次出现。
4. 任何叠放在视频播放窗口(MediaPlayerControl)上面的控件,视频播放开始后,都无法看见,也无法点击。没办法在视频画面上叠加一些操作按钮。
总之,在安卓下,这个 MediaPlayer 没法用。除非你只播放一个简单小视频,不需要转换为横屏做全屏播放。
因此,最终还是决定采用直接安卓的 TJIntent 来播放视频文件。这个方法之前试过,也有一些问题。当时的问题是:视频播放启动了,但点击屏幕左上角的回退按钮,关闭视频播放窗口时,偶尔会将 APP 的界面也关闭。
上网查,发现:这里有一个说法启发了我
里面有一句:Note: "SharedActivity" has been deprecated (at least in 10/Seatle). The replacement seems to be "TAndroidHelper.Activity"
我之前的代码确实是使用 SharedActivity。改为使用 TAndroidHelper.Activity 后,确实可以正常播放视频,正常退出视频播放了。
可以结束这篇博客了。在安卓下,播放一个 MP4 的视频文件,不要使用 FireMonkey 的 MediaPlayer,它很不正常。使用以下方法:
uri := StrToJURI('file://' + AURI);
Intent := TJIntent.JavaClass.init(TJIntent.JavaClass.ACTION_VIEW);
intent.setDataAndType(uri, StringToJstring('video/mp4'));
{-----------------------------------------------------------------------
以下代码,使用 SharedActivityContext 会导致视频播放时,点回退按钮,不单关掉了视频界面,连调用视频界面的界面都会被关掉(有时候,不确定)
改为 TAndroidHelper.Activity 以后,多次测试,可以正确关掉视频界面回到原来界面。
-----------------------------------------------------------------------}
//SharedActivityContext.startActivity(Intent);
TAndroidHelper.Activity.startActivity(Intent); //pcplayer 2018-4-11