提交 14adba1f authored 作者: kongdywang's avatar kongdywang

Fix IOS audio preemption issue & Android brightness issue

上级 7b3fa56b
...@@ -474,6 +474,16 @@ public class SuperPlayerPlugin implements FlutterPlugin, ActivityAware, ...@@ -474,6 +474,16 @@ public class SuperPlayerPlugin implements FlutterPlugin, ActivityAware,
return doubleMsg; return doubleMsg;
} }
@NonNull
@Override
public DoubleMsg getSysBrightness() {
float brightness = getSystemScreenBrightness();
BigDecimal bigDecimal = BigDecimal.valueOf(brightness);
DoubleMsg doubleMsg = new DoubleMsg();
doubleMsg.setValue(bigDecimal.doubleValue());
return doubleMsg;
}
@Override @Override
public void setSystemVolume(@NonNull DoubleMsg volume) { public void setSystemVolume(@NonNull DoubleMsg volume) {
mTxAudioManager.setSystemVolume(volume.getValue()); mTxAudioManager.setSystemVolume(volume.getValue());
......
...@@ -29,7 +29,6 @@ NSString *const NOTIFCATION_NAME = @"SystemVolumeDidChange"; ...@@ -29,7 +29,6 @@ NSString *const NOTIFCATION_NAME = @"SystemVolumeDidChange";
} }
audioSession = [AVAudioSession sharedInstance]; audioSession = [AVAudioSession sharedInstance];
[audioSession setActive:true error:nil];
} }
return self; return self;
}; };
...@@ -44,6 +43,8 @@ NSString *const NOTIFCATION_NAME = @"SystemVolumeDidChange"; ...@@ -44,6 +43,8 @@ NSString *const NOTIFCATION_NAME = @"SystemVolumeDidChange";
{ {
// 需要设置 showsVolumeSlider 为 YES // 需要设置 showsVolumeSlider 为 YES
volumeView.showsVolumeSlider = YES; volumeView.showsVolumeSlider = YES;
// 获取音频焦点
[audioSession setActive:true error:nil];
[_volumeSlider setValue:value animated:NO]; [_volumeSlider setValue:value animated:NO];
[_volumeSlider sendActionsForControlEvents:UIControlEventTouchUpInside]; [_volumeSlider sendActionsForControlEvents:UIControlEventTouchUpInside];
[_volumeSlider sizeToFit]; [_volumeSlider sizeToFit];
...@@ -51,6 +52,8 @@ NSString *const NOTIFCATION_NAME = @"SystemVolumeDidChange"; ...@@ -51,6 +52,8 @@ NSString *const NOTIFCATION_NAME = @"SystemVolumeDidChange";
- (void)setVolumeUIVisible:(BOOL)volumeUIVisible - (void)setVolumeUIVisible:(BOOL)volumeUIVisible
{ {
// 获取音频焦点
[audioSession setActive:true error:nil];
volumeView.hidden = !volumeUIVisible; volumeView.hidden = !volumeUIVisible;
} }
......
...@@ -306,6 +306,11 @@ SuperPlayerPlugin* instance; ...@@ -306,6 +306,11 @@ SuperPlayerPlugin* instance;
return [CommonUtil doubleMsgWith:brightness.doubleValue]; return [CommonUtil doubleMsgWith:brightness.doubleValue];
} }
- (DoubleMsg *)getSysBrightnessWithError:(FlutterError * _Nullable __autoreleasing *)error {
NSNumber *brightness = [NSNumber numberWithFloat:[UIScreen mainScreen].brightness];
return [CommonUtil doubleMsgWith:brightness.doubleValue];
}
- (nullable DoubleMsg *)getSystemVolumeWithError:(FlutterError * _Nullable __autoreleasing * _Nonnull)error { - (nullable DoubleMsg *)getSystemVolumeWithError:(FlutterError * _Nullable __autoreleasing * _Nonnull)error {
NSNumber *volume = [NSNumber numberWithFloat:[audioManager getVolume]]; NSNumber *volume = [NSNumber numberWithFloat:[audioManager getVolume]];
return [CommonUtil doubleMsgWith:volume.doubleValue]; return [CommonUtil doubleMsgWith:volume.doubleValue];
......
// // Copyright (c) 2022 Tencent. All rights reserved. // // Copyright (c) 2022 Tencent. All rights reserved.
// Autogenerated from Pigeon (v9.0.4), do not edit directly. // Autogenerated from Pigeon (v9.1.0), do not edit directly.
// See also: https://pub.dev/packages/pigeon // See also: https://pub.dev/packages/pigeon
#import <Foundation/Foundation.h> #import <Foundation/Foundation.h>
...@@ -35,7 +35,7 @@ NS_ASSUME_NONNULL_BEGIN ...@@ -35,7 +35,7 @@ NS_ASSUME_NONNULL_BEGIN
@class MapMsg; @class MapMsg;
/// pigeon原始原件,由此文件生成messages原生通信代码 /// pigeon原始原件,由此文件生成messages原生通信代码
/// 生成命令如下 /// 生成命令如下,使用生成命令的时候,需要实现注释掉以上两个import导入
@interface PlayerMsg : NSObject @interface PlayerMsg : NSObject
+ (instancetype)makeWithPlayerId:(nullable NSNumber *)playerId; + (instancetype)makeWithPlayerId:(nullable NSNumber *)playerId;
@property(nonatomic, strong, nullable) NSNumber * playerId; @property(nonatomic, strong, nullable) NSNumber * playerId;
...@@ -365,6 +365,10 @@ NSObject<FlutterMessageCodec> *TXFlutterNativeAPIGetCodec(void); ...@@ -365,6 +365,10 @@ NSObject<FlutterMessageCodec> *TXFlutterNativeAPIGetCodec(void);
/// ///
/// @return `nil` only when `error != nil`. /// @return `nil` only when `error != nil`.
- (nullable DoubleMsg *)getBrightnessWithError:(FlutterError *_Nullable *_Nonnull)error; - (nullable DoubleMsg *)getBrightnessWithError:(FlutterError *_Nullable *_Nonnull)error;
/// 获取系统界面亮度,IOS系统与界面亮度一致,安卓可能会有差异
///
/// @return `nil` only when `error != nil`.
- (nullable DoubleMsg *)getSysBrightnessWithError:(FlutterError *_Nullable *_Nonnull)error;
/// 设置当前系统音量,0.0 ~ 1.0 /// 设置当前系统音量,0.0 ~ 1.0
- (void)setSystemVolumeVolume:(DoubleMsg *)volume error:(FlutterError *_Nullable *_Nonnull)error; - (void)setSystemVolumeVolume:(DoubleMsg *)volume error:(FlutterError *_Nullable *_Nonnull)error;
/// 获得当前系统音量,范围:0.0 ~ 1.0 /// 获得当前系统音量,范围:0.0 ~ 1.0
......
// // Copyright (c) 2022 Tencent. All rights reserved. // // Copyright (c) 2022 Tencent. All rights reserved.
// Autogenerated from Pigeon (v9.0.4), do not edit directly. // Autogenerated from Pigeon (v9.1.0), do not edit directly.
// See also: https://pub.dev/packages/pigeon // See also: https://pub.dev/packages/pigeon
#import "FtxMessages.h" #import "FtxMessages.h"
...@@ -1291,6 +1291,24 @@ void TXFlutterNativeAPISetup(id<FlutterBinaryMessenger> binaryMessenger, NSObjec ...@@ -1291,6 +1291,24 @@ void TXFlutterNativeAPISetup(id<FlutterBinaryMessenger> binaryMessenger, NSObjec
[channel setMessageHandler:nil]; [channel setMessageHandler:nil];
} }
} }
/// 获取系统界面亮度,IOS系统与界面亮度一致,安卓可能会有差异
{
FlutterBasicMessageChannel *channel =
[[FlutterBasicMessageChannel alloc]
initWithName:@"dev.flutter.pigeon.TXFlutterNativeAPI.getSysBrightness"
binaryMessenger:binaryMessenger
codec:TXFlutterNativeAPIGetCodec()];
if (api) {
NSCAssert([api respondsToSelector:@selector(getSysBrightnessWithError:)], @"TXFlutterNativeAPI api (%@) doesn't respond to @selector(getSysBrightnessWithError:)", api);
[channel setMessageHandler:^(id _Nullable message, FlutterReply callback) {
FlutterError *error;
DoubleMsg *output = [api getSysBrightnessWithError:&error];
callback(wrapResult(output, error));
}];
} else {
[channel setMessageHandler:nil];
}
}
/// 设置当前系统音量,0.0 ~ 1.0 /// 设置当前系统音量,0.0 ~ 1.0
{ {
FlutterBasicMessageChannel *channel = FlutterBasicMessageChannel *channel =
......
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
import 'package:pigeon/pigeon.dart'; import 'package:pigeon/pigeon.dart';
import 'package:super_player/super_player.dart'; import 'package:super_player/super_player.dart';
/// pigeon原始原件,由此文件生成messages原生通信代码 /// pigeon原始原件,由此文件生成messages原生通信代码
/// 生成命令如下 /// 生成命令如下,使用生成命令的时候,需要实现注释掉以上两个import导入
/* /*
flutter pub run pigeon \ flutter pub run pigeon \
--input lib/Core/pigeons/txplayer_message.dart \ --input lib/Core/pigeons/txplayer_message.dart \
...@@ -335,6 +335,9 @@ abstract class TXFlutterNativeAPI { ...@@ -335,6 +335,9 @@ abstract class TXFlutterNativeAPI {
/// 获得当前界面亮度 0.0 ~ 1.0 /// 获得当前界面亮度 0.0 ~ 1.0
DoubleMsg getBrightness(); DoubleMsg getBrightness();
/// 获取系统界面亮度,IOS系统与界面亮度一致,安卓可能会有差异
DoubleMsg getSysBrightness();
/// 设置当前系统音量,0.0 ~ 1.0 /// 设置当前系统音量,0.0 ~ 1.0
void setSystemVolume(DoubleMsg volume); void setSystemVolume(DoubleMsg volume);
......
...@@ -130,6 +130,12 @@ class SuperPlayerPlugin { ...@@ -130,6 +130,12 @@ class SuperPlayerPlugin {
return doubleMsg.value; return doubleMsg.value;
} }
/// 获取系统界面亮度,IOS系统与界面亮度一致,安卓可能会有差异 范围:0.0 ~ 1.0
static Future<double?> getSysBrightness() async {
DoubleMsg doubleMsg = await _nativeAPI.getSysBrightness();
return doubleMsg.value;
}
/// 设置当前系统音量,0.0 ~ 1.0 /// 设置当前系统音量,0.0 ~ 1.0
static Future<void> setSystemVolume(double volume) async { static Future<void> setSystemVolume(double volume) async {
return await _nativeAPI.setSystemVolume(DoubleMsg()..value = volume); return await _nativeAPI.setSystemVolume(DoubleMsg()..value = volume);
......
// // Copyright (c) 2022 Tencent. All rights reserved.
// Copyright (c) 2022 Tencent. All rights reserved.
part of SuperPlayer; part of SuperPlayer;
// Autogenerated from Pigeon (v9.0.4), do not edit directly.
// See also: https://pub.dev/packages/pigeon
// ignore_for_file: public_member_api_docs, non_constant_identifier_names, avoid_as, unused_import, unnecessary_parenthesis, prefer_null_aware_operators, omit_local_variable_types, unused_shown_name, unnecessary_import
/// pigeon原始原件,由此文件生成messages原生通信代码 /// pigeon原始原件,由此文件生成messages原生通信代码
/// 生成命令如下 /// 生成命令如下,使用生成命令的时候,需要实现注释掉以上两个import导入
class PlayerMsg { class PlayerMsg {
PlayerMsg({ PlayerMsg({
this.playerId, this.playerId,
...@@ -1290,6 +1288,34 @@ class TXFlutterNativeAPI { ...@@ -1290,6 +1288,34 @@ class TXFlutterNativeAPI {
} }
} }
/// 获取系统界面亮度,IOS系统与界面亮度一致,安卓可能会有差异
Future<DoubleMsg> getSysBrightness() async {
final BasicMessageChannel<Object?> channel = BasicMessageChannel<Object?>(
'dev.flutter.pigeon.TXFlutterNativeAPI.getSysBrightness', codec,
binaryMessenger: _binaryMessenger);
final List<Object?>? replyList =
await channel.send(null) as List<Object?>?;
if (replyList == null) {
throw PlatformException(
code: 'channel-error',
message: 'Unable to establish connection on channel.',
);
} else if (replyList.length > 1) {
throw PlatformException(
code: replyList[0]! as String,
message: replyList[1] as String?,
details: replyList[2],
);
} else if (replyList[0] == null) {
throw PlatformException(
code: 'null-error',
message: 'Host platform returned null value for non-null return value.',
);
} else {
return (replyList[0] as DoubleMsg?)!;
}
}
/// 设置当前系统音量,0.0 ~ 1.0 /// 设置当前系统音量,0.0 ~ 1.0
Future<void> setSystemVolume(DoubleMsg arg_volume) async { Future<void> setSystemVolume(DoubleMsg arg_volume) async {
final BasicMessageChannel<Object?> channel = BasicMessageChannel<Object?>( final BasicMessageChannel<Object?> channel = BasicMessageChannel<Object?>(
......
...@@ -318,6 +318,7 @@ class SuperPlayerViewState extends State<SuperPlayerView> with WidgetsBindingObs ...@@ -318,6 +318,7 @@ class SuperPlayerViewState extends State<SuperPlayerView> with WidgetsBindingObs
// 页面从后台回来 // 页面从后台回来
// 不更新状态,直接resume // 不更新状态,直接resume
_playController.getCurrentController().resume(); _playController.getCurrentController().resume();
checkBrightness();
// 从后台回来之后,如果手机横竖屏状态发生更改,被改为竖屏,那么这里根据判断切换横屏 // 从后台回来之后,如果手机横竖屏状态发生更改,被改为竖屏,那么这里根据判断切换横屏
if (_playController._playerUIStatus == SuperPlayerUIStatus.FULLSCREEN_MODE && if (_playController._playerUIStatus == SuperPlayerUIStatus.FULLSCREEN_MODE &&
defaultTargetPlatform == TargetPlatform.iOS) { defaultTargetPlatform == TargetPlatform.iOS) {
...@@ -335,6 +336,14 @@ class SuperPlayerViewState extends State<SuperPlayerView> with WidgetsBindingObs ...@@ -335,6 +336,14 @@ class SuperPlayerViewState extends State<SuperPlayerView> with WidgetsBindingObs
} }
} }
void checkBrightness() async {
double? sysBrightness = await SuperPlayerPlugin.getSysBrightness();
double? windowBrightness = await SuperPlayerPlugin.getBrightness();
if(sysBrightness != windowBrightness && null != sysBrightness) {
SuperPlayerPlugin.setBrightness(sysBrightness);
}
}
void _calculateSize(double videoWidth, double videoHeight) { void _calculateSize(double videoWidth, double videoHeight) {
if (mounted && (0 != videoWidth && 0 != videoHeight) && if (mounted && (0 != videoWidth && 0 != videoHeight) &&
(_videoWidth != videoWidth && _videoHeight != videoHeight)) { (_videoWidth != videoWidth && _videoHeight != videoHeight)) {
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论