提交 86800444 authored 作者: kongdywang's avatar kongdywang

fix some pip bug & modify docs

上级 13fdf5b3
......@@ -3,8 +3,6 @@
xmlns:tools="http://schemas.android.com/tools"
package="com.tencent.vod.flutter">
<!-- android:documentLaunchMode="intoExisting"-->
<!-- android:excludeFromRecents="true"-->
<application>
<activity
android:name="com.tencent.vod.flutter.ui.FlutterPipImplActivity"
......
......@@ -151,7 +151,8 @@ SuperPlayerPlugin.setGlobalLicense(licenceURL, licenceKey);
## 常见问题
1. iOS端运行,出现 `No visible @interface for 'TXLivePlayer' declares the selector 'startLivePlay:type:'`等类似找不到接口错误。
**解决方法**
可以使用如下命令,更新IOS SDK:
```shell
......@@ -164,6 +165,7 @@ pod update
常见异常日志:`java. lang.RuntimeException: Duplicate class com.tencent.liteav.TXLiteAVCode found in modules classes.jar`
**解决方法**
此时需要集成flutter 播放器的 Professional 版本,让tencent_trtc_cloud 和 flutter 播放器共同依赖于同一个版的 LiteAVSDK_Professional。注意确保依赖的LiteAVSDK_Professional 的版本必须一样。
如:依赖Android 端TXLiteAVSDK_Professional_10.3.0.11196 和 iOS 端TXLiteAVSDK_Professional to 10.3.12231 版本,依赖声明如下:
......@@ -179,19 +181,38 @@ pod update
```
3. 需要同时使用多个播放器实例的时候,频繁切换播放视频,画面呈现模糊。
**解决方法**:
​ 在每个播放器组件容器销毁的时候,调用播放器的`dispose`方法,将播放器释放
4. 其余通用flutter依赖问题
**解决方法**:
- 执行`flutter doctor`命令检查运行环境,直到出现”No issues found!“。
- 执行`flutter pub get`确保所有依赖的组件都已更新成功。
5. 集成superPlayer之后,出现如下manifest错误:
```text
Attribute application@label value=(super_player_example) from AndroidManifest.xml:9:9-45
is also present at [com.tencent.liteav:LiteAVSDK_Player:10.8.0.13065] AndroidManifest.xml:22:9-41 value=(@string/app_name).
Suggestion: add 'tools:replace="android:label"' to <application> element at AndroidManifest.xml:8:4-51:19 to override.
```
**解决方法**:由于播放器安卓SDK的AndroidManifest已经定义过label,而flutter新建项目之后,在安卓目录的AndroidManifest也会定义label,此处建议根据错误提示,进入您的安卓项目目录,在AndroidManifest的根节点`manifest`节点下增加` xmlns:tools="http://schemas.android.com/tools" `,并在application节点下增加`'tools:replace="android:label"'`。
6. 集成superPlayer之后,出现如下版本错误:
```text
uses-sdk:minSdkVersion 16 cannot be smaller than version 19 declared in library [:super_player]
```
**解决方法**:目前播放器安卓SDK最小支持版本为android 19,flutter部分版本默认安卓最小支持版本为android 16。建议您将最小支持版本提高到android 19。具体修改方法为,进入您的安卓项目的主module下,一般为`app`目录,将该目录下的`build.gradle`中的`minSdkVersion`修改为19。
## 更多功能
你可以通过运行项目中的example体验完整功能,[example运行指引](example运行指引.md)
播放器SDK官网提供了iOS、Android和Web 端的Demo体验,[请点击这里](https://cloud.tencent.com/document/product/881/20204)
播放器SDK官网提供了iOS、Android和Web 端的Demo体验,[请点击这里](https://cloud.tencent.com/document/product/881/20204)
......
......@@ -45,7 +45,7 @@ class _TXVodPlayerPageState extends State<ShortVideoPageWidget> {
}
_init() async {
await _controller?.initialize();
await _controller.initialize();
_controller.setConfig(FTXVodPlayConfig());
LogUtils.i(TAG, " [init] ${widget.position.toString()} ${this.hashCode.toString()} ${_controller.hashCode.toString()}");
_setPlayerListener();
......
......@@ -71,7 +71,7 @@ class TXPlayerVideoState extends State<TXPlayerVideo> {
var viewWidth = constrains.maxWidth;
var viewHeight = constrains.maxHeight;
var videoWidth = controller.resizeVideoWidth!;
var videoHeight = widget.controller.resizeVideoHeight!;
var videoHeight = controller.resizeVideoHeight!;
double left = controller.videoLeft! * viewWidth / videoWidth;
double top = controller.videoTop! * viewHeight / videoHeight;
......
......@@ -6,6 +6,7 @@ class TXPipPlayerData {
/// 画中画播放器实例,同时只能存在一个
final TXPlayerController _playerController;
int playerMode = TXPlayerType.VOD_PLAY;
bool isEnterPip = false;
TXPipPlayerData(this._playerController) {
playerMode = _playerController is TXVodPlayerController ? TXPlayerType.VOD_PLAY : playerMode = TXPlayerType.LIVE_PLAY;
......
......@@ -43,18 +43,22 @@ class TXPipController {
if ((Platform.isIOS && eventCode == TXVodPlayEvent.EVENT_PIP_MODE_ALREADY_ENTER) ||
(Platform.isAndroid && eventCode == TXVodPlayEvent.EVENT_PIP_MODE_REQUEST_START)) {
_onPipEnterListener?.onNeedSavePipPageState(_extParams);
_playerData?.isEnterPip = true;
Navigator.of(context).pop();
} else if ((Platform.isIOS && eventCode == TXVodPlayEvent.EVENT_IOS_PIP_MODE_WILL_EXIT)
|| (Platform.isAndroid && eventCode == TXVodPlayEvent.EVENT_PIP_MODE_ALREADY_EXIT)) {
} else if ((Platform.isIOS && eventCode == TXVodPlayEvent.EVENT_IOS_PIP_MODE_WILL_EXIT) ||
(Platform.isAndroid && eventCode == TXVodPlayEvent.EVENT_PIP_MODE_ALREADY_EXIT)) {
_playerData?.isEnterPip = false;
await exitAndReleaseCurrentPip();
} else if (eventCode == TXVodPlayEvent.EVENT_IOS_PIP_MODE_RESTORE_UI) {
_extParams[ARGUMENT_PIP_START_TIME] = event["playTime"];
await exitAndReleaseCurrentPip();
_onJumpToPipPlayer?.call(_extParams);
} else if(eventCode < 0) {
// pip enter failed
_pipEventSubscription?.cancel();
_playerData = null;
} else if (eventCode < 0) {
if (_playerData != null && _playerData!.isEnterPip) {
exitAndReleaseCurrentPip();
} else {
_releasePlayerData();
}
}
});
int enterResult = await _playerData!._playerController.enterPictureInPictureMode(
......@@ -63,20 +67,23 @@ class TXPipController {
pauseIconForAndroid: pauseIconForAndroid,
forwardIconForAndroid: forwardIconForAndroid);
if (enterResult != TXVodPlayEvent.NO_ERROR) {
_playerData = null;
_pipEventSubscription?.cancel();
_releasePlayerData();
}
return enterResult;
}
Future<void> exitAndReleaseCurrentPip() async {
if (null != _playerData && _playerData?._playerController != null) {
if(Platform.isAndroid) {
if (Platform.isAndroid) {
await _playerData?._playerController.exitPictureInPictureMode();
}
await _playerData?._playerController.stop();
_playerData?._playerController.dispose();
}
_releasePlayerData();
}
void _releasePlayerData() {
_pipEventSubscription?.cancel();
_playerData = null;
}
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论