欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

Delphi MediaPlayer Android 的问题 之二

程序员文章站 2022-12-25 15:30:30
这几天都在折腾 delphi firemonkey mediaplayer 在安卓下的问题。 查源代码,这个 mediaplayer 也是封装了安卓的 mediaplayer,播放界面使用了安卓的...

这几天都在折腾 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