Delphi MediaPlayer Android 的问题 之二
这几天都在折腾 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
上一篇: Android 下载网络图片保存到本地
下一篇: 百度搜索将上线"飓风算法 2.0"
推荐阅读