我使用FireMonkey开发了一个Android程序。该程序有一个
TTabItem
。我使用 TMediaPlayerControl
在 TabItem 下播放视频。在播放过程中,我切换TabItem,停止并隐藏播放器。在这种情况下,就很容易出现这种情况。黑匣子没有消失,我不知道为什么。
希望播放视频时,切换TabItem不会出现黑框。也就是说,播放器界面没有隐藏成功。代码如下:
player1->Stop();
playCtrl1->Visible = false;
tabControl1->ActiveTab = tabItem1;
根据 bug #RSS-978,Android 上的
TMediaPlayer
可以创建多个平台播放器,但会泄漏它们。所以也许您看到泄露的玩家没有被隐藏。
错误报告提供了以下泄漏解决方法。也许它也能解决隐藏问题。
泄漏的原因在“source mx\FMX.Media.Android.pas”中。 FMX Delphi 为每个视频“TJMediaPlayer.JavaClass.init”创建播放器两次。一旦进入“procedure TAndroidVideo.RetreiveVideoSize”就可以获取视频图片的大小了。第二次在“构造函数 TAndroidMedia.Create”中,然后就可以播放视频文件了。
第一次他们忘记在“RetreiveVideoSize”中调用“MediaPlayer.release”。因此,在操作系统中创建的媒体组件的资源不会被释放。在某些 Android 设备上,应用程序会崩溃。
解决方案:自行修补“FMX.Media.Android.pas”。在“procedure TAndroidVideo.RetreiveVideoSize”中添加对“MediaPlayer.release”的调用。
procedure TAndroidVideo.RetreiveVideoSize; var MediaPlayer: JMediaPlayer; begin MediaPlayer := TJMediaPlayer.JavaClass.init; MediaPlayer.setDataSource(StringToJString(FileName)); MediaPlayer.prepare; FVideoSize := TSize.Create(MediaPlayer.getVideoWidth, MediaPlayer.getVideoHeight); MediaPlayer.release; // !!!!!!! add this line !!!!!!! MediaPlayer := nil; end;