Skip to content
项目
群组
代码片段
帮助
当前项目
正在载入...
登录 / 注册
切换导航面板
T
tx_player_fork
项目
项目
详情
活动
周期分析
仓库
仓库
文件
提交
分支
标签
贡献者
图表
比较
统计图
议题
0
议题
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
CI / CD
CI / CD
流水线
作业
日程
统计图
Wiki
Wiki
代码片段
代码片段
成员
成员
折叠边栏
关闭边栏
活动
图像
聊天
创建新问题
作业
提交
问题看板
Open sidebar
蒋俊
tx_player_fork
Commits
2711c048
提交
2711c048
authored
9月 22, 2022
作者:
kongdywang
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
fix ios pip pause UI error
上级
d8f8b1cd
隐藏空白字符变更
内嵌
并排
正在显示
4 个修改的文件
包含
45 行增加
和
32 行删除
+45
-32
FTXPIPManager.java
.../src/main/java/com/tencent/vod/flutter/FTXPIPManager.java
+35
-25
build.gradle
Flutter/example/android/app/build.gradle
+1
-1
superplayer_controller.dart
Flutter/example/lib/superplayer/superplayer_controller.dart
+3
-2
superplayer_widget.dart
Flutter/example/lib/superplayer/ui/superplayer_widget.dart
+6
-4
没有找到文件。
Flutter/android/src/main/java/com/tencent/vod/flutter/FTXPIPManager.java
浏览文件 @
2711c048
...
@@ -26,7 +26,7 @@ import java.util.HashMap;
...
@@ -26,7 +26,7 @@ import java.util.HashMap;
import
java.util.List
;
import
java.util.List
;
import
java.util.Map
;
import
java.util.Map
;
import
io.flutter
.Log
;
import
android.util
.Log
;
import
io.flutter.embedding.engine.plugins.FlutterPlugin
;
import
io.flutter.embedding.engine.plugins.FlutterPlugin
;
/**
/**
...
@@ -35,11 +35,11 @@ import io.flutter.embedding.engine.plugins.FlutterPlugin;
...
@@ -35,11 +35,11 @@ import io.flutter.embedding.engine.plugins.FlutterPlugin;
public
class
FTXPIPManager
{
public
class
FTXPIPManager
{
private
final
static
String
TAG
=
"FTXPIPManager"
;
private
final
static
String
TAG
=
"FTXPIPManager"
;
private
boolean
isRegisterReceiver
=
false
;
private
boolean
isRegisterReceiver
=
false
;
private
final
Map
<
Integer
,
PipCallback
>
pipCallbacks
=
new
HashMap
<>();
private
final
Map
<
Integer
,
PipCallback
>
pipCallbacks
=
new
HashMap
<>();
FTXAudioManager
mTxAudioManager
;
FTXAudioManager
mTxAudioManager
;
private
Activity
mActivity
;
private
Activity
mActivity
;
private
FlutterPlugin
.
FlutterAssets
mFlutterAssets
;
private
FlutterPlugin
.
FlutterAssets
mFlutterAssets
;
private
final
BroadcastReceiver
pipActionReceiver
=
new
BroadcastReceiver
()
{
private
final
BroadcastReceiver
pipActionReceiver
=
new
BroadcastReceiver
()
{
...
@@ -66,8 +66,8 @@ public class FTXPIPManager {
...
@@ -66,8 +66,8 @@ public class FTXPIPManager {
/**
/**
* @param mTxAudioManager 音频管理,用于画中画模式下请求音频焦点
* @param mTxAudioManager 音频管理,用于画中画模式下请求音频焦点
* @param mActivity activity
* @param mActivity
activity
* @param flutterAssets flutter资源管理
* @param flutterAssets
flutter资源管理
*/
*/
public
FTXPIPManager
(
FTXAudioManager
mTxAudioManager
,
public
FTXPIPManager
(
FTXAudioManager
mTxAudioManager
,
Activity
mActivity
,
FlutterPlugin
.
FlutterAssets
flutterAssets
)
{
Activity
mActivity
,
FlutterPlugin
.
FlutterAssets
flutterAssets
)
{
...
@@ -112,7 +112,7 @@ public class FTXPIPManager {
...
@@ -112,7 +112,7 @@ public class FTXPIPManager {
params
.
mPipParams
=
new
PictureInPictureParams
.
Builder
();
params
.
mPipParams
=
new
PictureInPictureParams
.
Builder
();
updatePipActions
(
isPlaying
,
params
);
updatePipActions
(
isPlaying
,
params
);
boolean
enterResult
=
mActivity
.
enterPictureInPictureMode
(
params
.
mPipParams
.
build
());
boolean
enterResult
=
mActivity
.
enterPictureInPictureMode
(
params
.
mPipParams
.
build
());
if
(!
enterResult
)
{
if
(!
enterResult
)
{
pipResult
=
FTXEvent
.
ERROR_PIP_DENIED_PERMISSION
;
pipResult
=
FTXEvent
.
ERROR_PIP_DENIED_PERMISSION
;
}
}
}
else
{
}
else
{
...
@@ -133,7 +133,7 @@ public class FTXPIPManager {
...
@@ -133,7 +133,7 @@ public class FTXPIPManager {
if
(!
isSuccess
)
{
if
(!
isSuccess
)
{
pipResult
=
FTXEvent
.
ERROR_PIP_DENIED_PERMISSION
;
pipResult
=
FTXEvent
.
ERROR_PIP_DENIED_PERMISSION
;
Log
.
e
(
TAG
,
"enterPip failed,because PIP feature is disabled"
);
Log
.
e
(
TAG
,
"enterPip failed,because PIP feature is disabled"
);
}
else
if
(!
hasPipPermission
())
{
}
else
if
(!
hasPipPermission
())
{
pipResult
=
FTXEvent
.
ERROR_PIP_DENIED_PERMISSION
;
pipResult
=
FTXEvent
.
ERROR_PIP_DENIED_PERMISSION
;
Log
.
e
(
TAG
,
"enterPip failed,because PIP has no permission"
);
Log
.
e
(
TAG
,
"enterPip failed,because PIP has no permission"
);
}
}
...
@@ -153,7 +153,7 @@ public class FTXPIPManager {
...
@@ -153,7 +153,7 @@ public class FTXPIPManager {
AppOpsManager
appOpsManager
=
(
AppOpsManager
)
mActivity
.
getSystemService
(
Context
.
APP_OPS_SERVICE
);
AppOpsManager
appOpsManager
=
(
AppOpsManager
)
mActivity
.
getSystemService
(
Context
.
APP_OPS_SERVICE
);
if
(
android
.
os
.
Build
.
VERSION
.
SDK_INT
>=
android
.
os
.
Build
.
VERSION_CODES
.
O
)
{
if
(
android
.
os
.
Build
.
VERSION
.
SDK_INT
>=
android
.
os
.
Build
.
VERSION_CODES
.
O
)
{
int
permissionResult
=
appOpsManager
.
checkOpNoThrow
(
AppOpsManager
.
OPSTR_PICTURE_IN_PICTURE
,
int
permissionResult
=
appOpsManager
.
checkOpNoThrow
(
AppOpsManager
.
OPSTR_PICTURE_IN_PICTURE
,
android
.
os
.
Process
.
myUid
(),
mActivity
.
getPackageName
());
android
.
os
.
Process
.
myUid
(),
mActivity
.
getPackageName
());
return
permissionResult
==
AppOpsManager
.
MODE_ALLOWED
;
return
permissionResult
==
AppOpsManager
.
MODE_ALLOWED
;
}
else
{
}
else
{
return
false
;
return
false
;
...
@@ -184,15 +184,25 @@ public class FTXPIPManager {
...
@@ -184,15 +184,25 @@ public class FTXPIPManager {
}
}
private
void
initPipReceiver
()
{
private
void
initPipReceiver
()
{
if
(!
isRegisterReceiver
)
{
try
{
IntentFilter
pipIntentFilter
=
new
IntentFilter
(
FTXEvent
.
ACTION_PIP_PLAY_CONTROL
);
if
(!
isRegisterReceiver
)
{
mActivity
.
registerReceiver
(
pipActionReceiver
,
pipIntentFilter
);
IntentFilter
pipIntentFilter
=
new
IntentFilter
(
FTXEvent
.
ACTION_PIP_PLAY_CONTROL
);
isRegisterReceiver
=
true
;
mActivity
.
registerReceiver
(
pipActionReceiver
,
pipIntentFilter
);
isRegisterReceiver
=
true
;
}
}
catch
(
Exception
e
)
{
Log
.
getStackTraceString
(
e
);
}
}
}
}
public
void
releaseReceiver
()
{
public
void
releaseReceiver
()
{
mActivity
.
unregisterReceiver
(
pipActionReceiver
);
try
{
if
(
isRegisterReceiver
)
{
mActivity
.
unregisterReceiver
(
pipActionReceiver
);
}
}
catch
(
Exception
e
)
{
Log
.
getStackTraceString
(
e
);
}
}
}
/**
/**
...
@@ -207,7 +217,7 @@ public class FTXPIPManager {
...
@@ -207,7 +217,7 @@ public class FTXPIPManager {
if
(
android
.
os
.
Build
.
VERSION
.
SDK_INT
>=
android
.
os
.
Build
.
VERSION_CODES
.
O
)
{
if
(
android
.
os
.
Build
.
VERSION
.
SDK_INT
>=
android
.
os
.
Build
.
VERSION_CODES
.
O
)
{
List
<
RemoteAction
>
actions
=
new
ArrayList
<>();
List
<
RemoteAction
>
actions
=
new
ArrayList
<>();
// play back
// play back
if
(
params
.
mIsNeedPlayBack
)
{
if
(
params
.
mIsNeedPlayBack
)
{
Bundle
backData
=
new
Bundle
();
Bundle
backData
=
new
Bundle
();
backData
.
putInt
(
FTXEvent
.
EXTRA_NAME_PLAY_OP
,
FTXEvent
.
EXTRA_PIP_PLAY_BACK
);
backData
.
putInt
(
FTXEvent
.
EXTRA_NAME_PLAY_OP
,
FTXEvent
.
EXTRA_PIP_PLAY_BACK
);
backData
.
putInt
(
FTXEvent
.
EXTRA_NAME_PLAYER_ID
,
params
.
mCurrentPlayerId
);
backData
.
putInt
(
FTXEvent
.
EXTRA_NAME_PLAYER_ID
,
params
.
mCurrentPlayerId
);
...
@@ -219,7 +229,7 @@ public class FTXPIPManager {
...
@@ -219,7 +229,7 @@ public class FTXPIPManager {
}
}
// resume or pause
// resume or pause
if
(
params
.
mIsNeedPlayControl
)
{
if
(
params
.
mIsNeedPlayControl
)
{
Bundle
playOrPauseData
=
new
Bundle
();
Bundle
playOrPauseData
=
new
Bundle
();
playOrPauseData
.
putInt
(
FTXEvent
.
EXTRA_NAME_PLAYER_ID
,
params
.
mCurrentPlayerId
);
playOrPauseData
.
putInt
(
FTXEvent
.
EXTRA_NAME_PLAYER_ID
,
params
.
mCurrentPlayerId
);
playOrPauseData
.
putInt
(
FTXEvent
.
EXTRA_NAME_PLAY_OP
,
FTXEvent
.
EXTRA_PIP_PLAY_RESUME_OR_PAUSE
);
playOrPauseData
.
putInt
(
FTXEvent
.
EXTRA_NAME_PLAY_OP
,
FTXEvent
.
EXTRA_PIP_PLAY_RESUME_OR_PAUSE
);
...
@@ -233,7 +243,7 @@ public class FTXPIPManager {
...
@@ -233,7 +243,7 @@ public class FTXPIPManager {
}
}
// forward
// forward
if
(
params
.
mIsNeedPlayForward
)
{
if
(
params
.
mIsNeedPlayForward
)
{
Bundle
forwardData
=
new
Bundle
();
Bundle
forwardData
=
new
Bundle
();
forwardData
.
putInt
(
FTXEvent
.
EXTRA_NAME_PLAY_OP
,
FTXEvent
.
EXTRA_PIP_PLAY_FORWARD
);
forwardData
.
putInt
(
FTXEvent
.
EXTRA_NAME_PLAY_OP
,
FTXEvent
.
EXTRA_PIP_PLAY_FORWARD
);
forwardData
.
putInt
(
FTXEvent
.
EXTRA_NAME_PLAYER_ID
,
params
.
mCurrentPlayerId
);
forwardData
.
putInt
(
FTXEvent
.
EXTRA_NAME_PLAYER_ID
,
params
.
mCurrentPlayerId
);
...
@@ -288,18 +298,18 @@ public class FTXPIPManager {
...
@@ -288,18 +298,18 @@ public class FTXPIPManager {
String
mPlayResumeAssetPath
;
String
mPlayResumeAssetPath
;
String
mPlayPauseAssetPath
;
String
mPlayPauseAssetPath
;
String
mPlayForwardAssetPath
;
String
mPlayForwardAssetPath
;
int
mCurrentPlayerId
;
int
mCurrentPlayerId
;
protected
PictureInPictureParams
.
Builder
mPipParams
;
protected
PictureInPictureParams
.
Builder
mPipParams
;
private
boolean
mIsNeedPlayBack
=
true
;
private
boolean
mIsNeedPlayBack
=
true
;
private
boolean
mIsNeedPlayForward
=
true
;
private
boolean
mIsNeedPlayForward
=
true
;
private
boolean
mIsNeedPlayControl
=
true
;
private
boolean
mIsNeedPlayControl
=
true
;
/**
/**
* @param mPlayBackAssetPath 回退按钮图片资源路径,传空则使用系统默认图标
* @param mPlayBackAssetPath
回退按钮图片资源路径,传空则使用系统默认图标
* @param mPlayResumeAssetPath 播放按钮图片资源路径,传空则使用系统默认图标
* @param mPlayResumeAssetPath
播放按钮图片资源路径,传空则使用系统默认图标
* @param mPlayPauseAssetPath 暂停按钮图片资源路径,传空则使用系统默认图标
* @param mPlayPauseAssetPath
暂停按钮图片资源路径,传空则使用系统默认图标
* @param mPlayForwardAssetPath 前进按钮图片资源路径,传空则使用系统默认图标
* @param mPlayForwardAssetPath 前进按钮图片资源路径,传空则使用系统默认图标
* @param mCurrentPlayerId 播放器id
* @param mCurrentPlayerId
播放器id
*/
*/
public
PipParams
(
String
mPlayBackAssetPath
,
String
mPlayResumeAssetPath
,
String
mPlayPauseAssetPath
,
public
PipParams
(
String
mPlayBackAssetPath
,
String
mPlayResumeAssetPath
,
String
mPlayPauseAssetPath
,
String
mPlayForwardAssetPath
,
int
mCurrentPlayerId
)
{
String
mPlayForwardAssetPath
,
int
mCurrentPlayerId
)
{
...
...
Flutter/example/android/app/build.gradle
浏览文件 @
2711c048
...
@@ -29,7 +29,7 @@ android {
...
@@ -29,7 +29,7 @@ android {
defaultConfig
{
defaultConfig
{
// TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html).
// TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html).
applicationId
"com.
example.super_player_example
"
applicationId
"com.
tencent.liteav.demo
"
minSdkVersion
19
minSdkVersion
19
targetSdkVersion
31
targetSdkVersion
31
versionCode
flutterVersionCode
.
toInteger
()
versionCode
flutterVersionCode
.
toInteger
()
...
...
Flutter/example/lib/superplayer/superplayer_controller.dart
浏览文件 @
2711c048
...
@@ -558,12 +558,12 @@ class SuperPlayerController {
...
@@ -558,12 +558,12 @@ class SuperPlayerController {
void
_updatePlayerUIStatus
(
int
status
)
{
void
_updatePlayerUIStatus
(
int
status
)
{
if
(
_playerUIStatus
!=
status
)
{
if
(
_playerUIStatus
!=
status
)
{
_playerUIStatus
=
status
;
if
(
status
==
SuperPlayerUIStatus
.
FULLSCREEN_MODE
)
{
if
(
status
==
SuperPlayerUIStatus
.
FULLSCREEN_MODE
)
{
_addSimpleEvent
(
SuperPlayerViewEvent
.
onStartFullScreenPlay
);
_addSimpleEvent
(
SuperPlayerViewEvent
.
onStartFullScreenPlay
);
}
else
{
}
else
if
(
_playerUIStatus
==
SuperPlayerUIStatus
.
FULLSCREEN_MODE
)
{
_addSimpleEvent
(
SuperPlayerViewEvent
.
onStopFullScreenPlay
);
_addSimpleEvent
(
SuperPlayerViewEvent
.
onStopFullScreenPlay
);
}
}
_playerUIStatus
=
status
;
}
}
}
}
...
@@ -656,6 +656,7 @@ class SuperPlayerController {
...
@@ -656,6 +656,7 @@ class SuperPlayerController {
/// seek 到需要的时间点进行播放
/// seek 到需要的时间点进行播放
Future
<
void
>
seek
(
double
progress
)
async
{
Future
<
void
>
seek
(
double
progress
)
async
{
if
(
playerType
==
SuperPlayerType
.
VOD
)
{
if
(
playerType
==
SuperPlayerType
.
VOD
)
{
_needToPause
=
false
;
await
_vodPlayerController
.
seek
(
progress
);
await
_vodPlayerController
.
seek
(
progress
);
bool
isPlaying
=
await
_vodPlayerController
.
isPlaying
();
bool
isPlaying
=
await
_vodPlayerController
.
isPlaying
();
// resume when not playing.if isPlaying is null,not resume
// resume when not playing.if isPlaying is null,not resume
...
...
Flutter/example/lib/superplayer/ui/superplayer_widget.dart
浏览文件 @
2711c048
...
@@ -84,8 +84,7 @@ class SuperPlayerViewState extends State<SuperPlayerView> with WidgetsBindingObs
...
@@ -84,8 +84,7 @@ class SuperPlayerViewState extends State<SuperPlayerView> with WidgetsBindingObs
}
}
});
});
// only register listen once
// only register listen once
_pipSubscription
=
_pipSubscription
=
SuperPlayerPlugin
.
instance
.
onExtraEventBroadcast
.
listen
((
event
)
{
SuperPlayerPlugin
.
instance
.
onExtraEventBroadcast
.
listen
((
event
)
{
int
eventCode
=
event
[
"event"
];
int
eventCode
=
event
[
"event"
];
if
(
eventCode
==
TXVodPlayEvent
.
EVENT_PIP_MODE_ALREADY_EXIT
)
{
if
(
eventCode
==
TXVodPlayEvent
.
EVENT_PIP_MODE_ALREADY_EXIT
)
{
// exit floatingMode
// exit floatingMode
...
@@ -96,9 +95,11 @@ class SuperPlayerViewState extends State<SuperPlayerView> with WidgetsBindingObs
...
@@ -96,9 +95,11 @@ class SuperPlayerViewState extends State<SuperPlayerView> with WidgetsBindingObs
_playController
.
getCurrentController
().
pause
();
_playController
.
getCurrentController
().
pause
();
}
}
}
else
if
(
Platform
.
isIOS
)
{
}
else
if
(
Platform
.
isIOS
)
{
_onResume
();
EasyLoading
.
dismiss
();
EasyLoading
.
dismiss
();
}
}
_isFloatingMode
=
false
;
_isFloatingMode
=
false
;
_playController
.
_updatePlayerUIStatus
(
SuperPlayerUIStatus
.
WINDOW_MODE
);
}
else
if
(
eventCode
==
TXVodPlayEvent
.
EVENT_PIP_MODE_REQUEST_START
)
{
}
else
if
(
eventCode
==
TXVodPlayEvent
.
EVENT_PIP_MODE_REQUEST_START
)
{
// EVENT_PIP_MODE_ALREADY_ENTER 的状态变化有滞后性,进入PIP之后才会通知,这里需要监听EVENT_PIP_MODE_REQUEST_START,
// EVENT_PIP_MODE_ALREADY_ENTER 的状态变化有滞后性,进入PIP之后才会通知,这里需要监听EVENT_PIP_MODE_REQUEST_START,
// 在即将进入PIP模式下就要开始进行PIP模式的UI准备
// 在即将进入PIP模式下就要开始进行PIP模式的UI准备
...
@@ -111,6 +112,7 @@ class SuperPlayerViewState extends State<SuperPlayerView> with WidgetsBindingObs
...
@@ -111,6 +112,7 @@ class SuperPlayerViewState extends State<SuperPlayerView> with WidgetsBindingObs
EasyLoading
.
showToast
(
StringResource
.
OPEN_PIP
);
EasyLoading
.
showToast
(
StringResource
.
OPEN_PIP
);
}
}
_isFloatingMode
=
true
;
_isFloatingMode
=
true
;
_playController
.
_updatePlayerUIStatus
(
SuperPlayerUIStatus
.
PIP_MODE
);
}
else
if
(
eventCode
==
TXVodPlayEvent
.
EVENT_PIP_MODE_ALREADY_ENTER
)
{
}
else
if
(
eventCode
==
TXVodPlayEvent
.
EVENT_PIP_MODE_ALREADY_ENTER
)
{
if
(
Platform
.
isIOS
)
{
if
(
Platform
.
isIOS
)
{
EasyLoading
.
dismiss
();
EasyLoading
.
dismiss
();
...
@@ -124,11 +126,11 @@ class SuperPlayerViewState extends State<SuperPlayerView> with WidgetsBindingObs
...
@@ -124,11 +126,11 @@ class SuperPlayerViewState extends State<SuperPlayerView> with WidgetsBindingObs
EasyLoading
.
showToast
(
StringResource
.
ERROR_PIP
);
EasyLoading
.
showToast
(
StringResource
.
ERROR_PIP
);
}
}
_isFloatingMode
=
false
;
_isFloatingMode
=
false
;
_playController
.
_updatePlayerUIStatus
(
SuperPlayerUIStatus
.
WINDOW_MODE
);
print
(
'
$eventCode
'
);
print
(
'
$eventCode
'
);
}
}
});
});
_volumeSubscription
=
_volumeSubscription
=
SuperPlayerPlugin
.
instance
.
onEventBroadcast
.
listen
((
event
)
{
SuperPlayerPlugin
.
instance
.
onEventBroadcast
.
listen
((
event
)
{
int
eventCode
=
event
[
"event"
];
int
eventCode
=
event
[
"event"
];
if
(
_isFloatingMode
&&
_isPlaying
)
{
if
(
_isFloatingMode
&&
_isPlaying
)
{
if
(
eventCode
==
TXVodPlayEvent
.
EVENT_AUDIO_FOCUS_PAUSE
)
{
if
(
eventCode
==
TXVodPlayEvent
.
EVENT_AUDIO_FOCUS_PAUSE
)
{
...
...
编写
预览
Markdown
格式
0%
重试
或
添加新文件
添加附件
取消
您添加了
0
人
到此讨论。请谨慎行事。
请先完成此评论的编辑!
取消
请
注册
或者
登录
后发表评论