//
// LCOnIntercomViewController.m
// LCOnDemo
//
// Created by é™ˆå˜‰ä¹ on 2021/4/26.
//
#import "LCOnIntercomViewController.h"
#import <AVFoundation/AVFoundation.h>
#import <Photos/Photos.h>
#import <AudioToolbox/AudioToolbox.h>
#import "LCUtlis.h"
#import "LCApiKit.h"
#import <LCOpenSDKDynamic/LCOpenSDKDynamic.h>
@interface LCOnIntercomViewController ()<LCOpenSDK_EventListener, LCOpenSDK_TalkerListener>
@property (nonatomic,assign) BOOL playing;
@property (nonatomic,assign) BOOL isInterrupt;
@property (nonatomic,assign) BOOL isSpeaking;
@property (nonatomic,strong) UIImage *snapImage; //截图
@property (nonatomic, strong) UIButton *backButton; //
@property (nonatomic, strong) UILabel *titleUILabel; //
@property (nonatomic, strong) UIView *centerView; //内容背景View
@property (nonatomic, strong) UIView *videoView;
@property (nonatomic, strong) UIView *unlockView;
@property (nonatomic, strong) UIButton *screenshotImgBtn; //截图
@property (nonatomic, strong) UIButton *unlockImgBtn; //å¼€é”
@property (nonatomic, strong) UIButton *hangUpImgBtn;//æŒ‚æ–æŒ‰é’®
@property (nonatomic, strong) UIButton *hangUpTextBtn;
@property (nonatomic, strong) UIButton *answerImgBtn;//æŽ¥å¬æŒ‰é’®
@property (nonatomic, strong) UIButton *answerTextBtn;
@property (nonatomic, strong) UIButton *calltimeBtn; //é€šè¯æ—¶é—´æŒ‰é’®
//定时器
@property (nonatomic,strong) dispatch_source_t countdownTimer;
@property (nonatomic,strong) dispatch_source_t openDoorTimer;
@property (nonatomic, assign) int openDoorTimeout;
@property (nonatomic, assign) int callTimeout;
/// æ’æ”¾å™¨
@property (nonatomic, strong) LCOpenSDK_PlayWindow *playWindow;
///对讲
@property (strong, nonatomic) LCOpenSDK_AudioTalk *talker;
@end
@implementation LCOnIntercomViewController{
BOOL isBackGround;
BOOL isAnswer;//是å¦å·²ç»ç‚¹å‡»æŽ¥å¬è¿‡äº†
NSString * tipStr;
NSString * okStr;
NSString * saveToTheAlbumsStr;
NSString * operationFailedStr;
NSString * refuseStr;
NSString * answerStr;
NSString * unlockSuccessfullyStr;
NSString * callingStr;
NSString * hangUpStr;
NSString * endOfCallStr;
// int openDoorTimeout;
//全局å˜é‡
SystemSoundID sound;
CGFloat Height66;
bool isShowErrorAlert;
}
- (void)viewDidLoad {
[super viewDidLoad];
self.view.backgroundColor = UIColor.whiteColor;
Height66 = GetRealWidth(66);
[self initLlanguage];
[self initTopBarView];
[self initCentetView];
[self initData];
// [self setAnswerBtnEnable:NO];
[self initESVideo];
//开始å呼
[self StartReverseCall];
[self ShowCalltimeBtn:callingStr];
//æ³¨å†Œå¼€é”æˆåŠŸç›‘å¬
[self addOpenSuccessAction];
// Do any additional setup after loading the view.
}
-(void)initLlanguage{
NSString *languageName = [[[NSUserDefaults standardUserDefaults] objectForKey:@"AppleLanguages"] objectAtIndex:0];
// ç®€ä½“ä¸æ–‡
if ([languageName rangeOfString:@"zh-Hans"].location != NSNotFound) {
tipStr = @"æç¤º";
okStr = @"确认";
saveToTheAlbumsStr = @"å·²ä¿å˜è‡³æ‰‹æœºç›¸å†Œ.";
operationFailedStr = @"æ“作失败";
refuseStr = @"æ‹’ç»";
answerStr = @"接å¬";
hangUpStr = @"挂æ–";
unlockSuccessfullyStr = @"开锿ˆåŠŸ";
callingStr = @"æ¥ç”µä¸...";
endOfCallStr = @"通è¯ç»“æŸ";
}else{
tipStr = @"Prompt";
okStr = @"OK";
saveToTheAlbumsStr = @"Saved to the albums.";
operationFailedStr = @"Operation failed.";
refuseStr = @"Refuse";
answerStr = @"Answer";
hangUpStr = @"Hang up";
unlockSuccessfullyStr = @"Unlock successfully";
callingStr = @"Incoming call";
endOfCallStr = @"End of call";
}
}
- (void)initTopBarView {
UIView *TopView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, self.view.frame.size.width, APP_TOP_BAR_HEIGHT)];
TopView.backgroundColor = HEXCOLORA(0xF7F7F7,1.0);
// [TopView addSubview:self.backButton];
[TopView addSubview:self.titleUILabel];
[self.view addSubview:TopView];
TopView.layer.shadowColor = [UIColor colorWithRed:0/255.0 green:0/255.0 blue:0/255.0 alpha:0.25].CGColor;
TopView.layer.shadowOffset = CGSizeMake(0,0.5);
TopView.layer.shadowOpacity = 1;
TopView.layer.shadowRadius = 0;
}
- (UIButton *)backButton{
if (_backButton == nil) {
_backButton = [[UIButton alloc] initWithFrame:CGRectMake(0, APP_STATUS_BAR_HEIGHT, 44, 44)];
[_backButton setImage:[UIImage imageNamed:@"ic_esvideo_on_back"] forState:UIControlStateNormal];
_backButton.imageEdgeInsets = UIEdgeInsetsMake(12,12,12,12);
[_backButton.imageView setContentMode:UIViewContentModeScaleAspectFit];
[_backButton addTarget:self action:@selector(backAction) forControlEvents:UIControlEventTouchUpInside];
}
return _backButton;
}
-(void)backAction{
[self.navigationController popViewControllerAnimated:true];
// [self dismissViewControllerAnimated:YES completion:NULL];
}
-(UILabel *)titleUILabel{
if (_titleUILabel == Nil) {
_titleUILabel = [[UILabel alloc] initWithFrame:CGRectMake(90, APP_STATUS_BAR_HEIGHT, self.view.frame.size.width - 180, 44)];
_titleUILabel.font = [UIFont fontWithName:APP_UIFont_BOLD size:18.0];
_titleUILabel.textColor = TextColor;
_titleUILabel.text = @"";
_titleUILabel.textAlignment = NSTextAlignmentCenter;
}
return _titleUILabel;
}
- (void)initCentetView {
[self.view addSubview:self.centerView];
// [self.centerView addSubview:self.collectButton];
[self.centerView addSubview:self.videoView];
[self.centerView addSubview:self.unlockView];
[self.unlockView addSubview:self.screenshotImgBtn];
[self.unlockView addSubview:self.unlockImgBtn];
[self.centerView addSubview:self.hangUpImgBtn];
[self.centerView addSubview:self.hangUpTextBtn];
[self.centerView addSubview:self.answerImgBtn];
[self.centerView addSubview:self.answerTextBtn];
[self.centerView addSubview:self.calltimeBtn];
}
- (UIView *)centerView{
if (_centerView == nil) {
_centerView = [[UIButton alloc] initWithFrame:CGRectMake(0, APP_TOP_BAR_HEIGHT, APP_SCREEN_WIDTH, APP_VISIBLE_HEIGHT)];
_centerView.backgroundColor = UIColor.whiteColor;
}
return _centerView;
}
-(void)setRadiusWithView:(UIView *)mView{
//顶部圆角
UIRectCorner corners = UIRectCornerTopLeft | UIRectCornerTopRight;
if (@available(iOS 11.0, *)) {
mView.layer.cornerRadius = 20;
mView.layer.maskedCorners = (CACornerMask)corners;
}else{
UIBezierPath *maskPath = [UIBezierPath bezierPathWithRoundedRect:mView.bounds byRoundingCorners:corners cornerRadii:CGSizeMake(20,20)];
//创建 layer
CAShapeLayer *maskLayer = [[CAShapeLayer alloc] init];
maskLayer.frame = mView.bounds;
//赋值
maskLayer.path = maskPath.CGPath;
mView.layer.mask = maskLayer;
}
}
-(UIView *)videoView{
if (_videoView == Nil) {
_videoView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, self.view.frame.size.width, GetRealWidth(210))];
_videoView.backgroundColor = UIColor.lightGrayColor;
_videoView.layer.shadowColor = [UIColor colorWithRed:0/255.0 green:0/255.0 blue:0/255.0 alpha:0.25].CGColor;
_videoView.layer.shadowOffset = CGSizeMake(0,0.5);
_videoView.layer.shadowOpacity = 1;
_videoView.layer.shadowRadius = 0;
}
return _videoView;
}
- (UIView *)unlockView{
if (_unlockView == nil) {
_unlockView = [[UIView alloc] initWithFrame:CGRectMake(0, GetRealWidth(210), APP_SCREEN_WIDTH, GetRealWidth(72))];
_unlockView.backgroundColor = HEXCOLORA(0x232323, 1.0);
_unlockView.layer.backgroundColor = [UIColor colorWithRed:255/255.0 green:255/255.0 blue:255/255.0 alpha:1.0].CGColor;
_unlockView.layer.shadowColor = [UIColor colorWithRed:204/255.0 green:204/255.0 blue:204/255.0 alpha:0.4].CGColor;
_unlockView.layer.shadowOffset = CGSizeMake(0,0.5);
_unlockView.layer.shadowOpacity = 1;
_unlockView.layer.shadowRadius = 0;
}
return _unlockView;
}
- (UIButton *)screenshotImgBtn{
if (_screenshotImgBtn == nil) {
_screenshotImgBtn = [[UIButton alloc] initWithFrame:CGRectMake(0, 0, GetRealWidth(44), GetRealWidth(44))];
[_screenshotImgBtn setImage:[UIImage imageNamed:@"ic_esvideo_on_takephoto_unselect"] forState:UIControlStateNormal];
// [_screenshotImgBtn setImage:[UIImage imageNamed:@"ic_esvideo_on_takephoto_select"] forState:UIControlStateSelected];
[_screenshotImgBtn.imageView setContentMode:UIViewContentModeScaleAspectFit];
[_screenshotImgBtn addTarget:self action:@selector(screenshotAction) forControlEvents:UIControlEventTouchUpInside | UIControlEventTouchUpOutside];
[_screenshotImgBtn addTarget:self action:@selector(screenshotDownAction) forControlEvents:UIControlEventTouchDown];
_screenshotImgBtn.adjustsImageWhenHighlighted = NO;
_screenshotImgBtn.center = CGPointMake(APP_SCREEN_WIDTH/4, GetRealWidth(38));
}
return _screenshotImgBtn;
}
-(void)screenshotDownAction{
[_screenshotImgBtn setImage:[UIImage imageNamed:@"ic_esvideo_on_takephoto_select"] forState:UIControlStateNormal];
}
-(void)screenshotAction{
[_screenshotImgBtn setImage:[UIImage imageNamed:@"ic_esvideo_on_takephoto_unselect"] forState:UIControlStateNormal];
// //截图
//截图
if(self.playWindow){
[self saveThumbImage];
}
}
- (UIButton *)unlockImgBtn{
if (_unlockImgBtn == nil) {
_unlockImgBtn = [[UIButton alloc] initWithFrame:CGRectMake(0,0, GetRealWidth(44), GetRealWidth(44))];
[_unlockImgBtn setImage:[UIImage imageNamed:@"ic_esvideo_on_unlock_unselect"] forState:UIControlStateNormal];
// [_unlockImgBtn setImage:[UIImage imageNamed:@"ic_esvideo_on_unlock_select"] forState:UIControlStateSelected];
[_unlockImgBtn.imageView setContentMode:UIViewContentModeScaleAspectFit];
[_unlockImgBtn addTarget:self action:@selector(unlockAction) forControlEvents:UIControlEventTouchUpInside | UIControlEventTouchUpOutside];
[_unlockImgBtn addTarget:self action:@selector(unlockDownAction) forControlEvents:UIControlEventTouchDown];
_unlockImgBtn.adjustsImageWhenHighlighted = NO;
_unlockImgBtn.center = CGPointMake((APP_SCREEN_WIDTH/4) * 3, GetRealWidth(38));
}
return _unlockImgBtn;
}
-(void)unlockDownAction{
[_unlockImgBtn setImage:[UIImage imageNamed:@"ic_esvideo_on_unlock_select"] forState:UIControlStateNormal];
}
-(void)unlockAction{
[_unlockImgBtn setImage:[UIImage imageNamed:@"ic_esvideo_on_unlock_unselect"] forState:UIControlStateNormal];
//å¼€é”
if(self.mLCCallDelegate != NULL){
[self.mLCCallDelegate onUnlockAction];
}
}
#pragma 挂æ–和开é”
- (UIButton *)hangUpImgBtn{
if (_hangUpImgBtn == nil) {
_hangUpImgBtn = [[UIButton alloc] initWithFrame:CGRectMake(0, 0, Height66, Height66)];
[_hangUpImgBtn setImage:[UIImage imageNamed:@"ic_esvideo_on_hangup"] forState:UIControlStateNormal];
// [_hangUpImgBtn setImage:[UIImage imageNamed:@"ic_esvideo_on_hangup"] forState:UIControlStateSelected];
[_hangUpImgBtn.imageView setContentMode:UIViewContentModeScaleAspectFit];
[_hangUpImgBtn addTarget:self action:@selector(hangUpAction) forControlEvents:UIControlEventTouchUpInside];
_hangUpImgBtn.center = CGPointMake(APP_SCREEN_WIDTH/4, GetRealHeight(452) + Height66/2);
}
return _hangUpImgBtn;
}
//æŒ‚æ–æŒ‰é’®äº‹ä»¶
-(void)hangUpAction{
//1.回调事件
if(self.mLCCallDelegate != NULL){
if(isAnswer){
//如果之å‰å·²ç»æŽ¥å¬äº†ï¼Œå›žè°ƒæ˜¯æŒ‚æ–
[self.mLCCallDelegate onHangUpAction:_callTimeout];
}else{
//å¦‚æžœä¹‹å‰æ²¡æŽ¥å¬äº†ï¼Œå›žè°ƒæ˜¯æ‹’接
[self.mLCCallDelegate onRejectCallAction];
}
}
//2.页é¢å…³é—
[self backAction];
}
- (UIButton *)hangUpTextBtn{
if (_hangUpTextBtn == nil) {
_hangUpTextBtn = [[UIButton alloc] initWithFrame:CGRectMake(0, 0, GetRealWidth(100), GetRealWidth(20))];
[_hangUpTextBtn setTitle:@"æ‹’ç»" forState:UIControlStateNormal];
_hangUpTextBtn.titleLabel.textAlignment = NSTextAlignmentCenter;
_hangUpTextBtn.titleLabel.font = [UIFont fontWithName:APP_UIFont size:14.0];
[_hangUpTextBtn setTitleColor:TextColor forState:UIControlStateNormal];
[_hangUpTextBtn setTitleColor:TextSelectColor forState:UIControlStateSelected];
[_hangUpTextBtn addTarget:self action:@selector(screenshotAction) forControlEvents:UIControlEventTouchUpInside];
_hangUpTextBtn.center = CGPointMake(_hangUpImgBtn.center.x, GetRealHeight(530));
}
return _hangUpTextBtn;
}
- (UIButton *)answerImgBtn{
if (_answerImgBtn == nil) {
_answerImgBtn = [[UIButton alloc] initWithFrame:CGRectMake(0, 0, Height66, Height66)];
[_answerImgBtn setImage:[UIImage imageNamed:@"ic_esvideo_on_answer"] forState:UIControlStateNormal];
// [_answerImgBtn setImage:[UIImage imageNamed:@"ic_esvideo_on_answer"] forState:UIControlStateSelected];
[_answerImgBtn.imageView setContentMode:UIViewContentModeScaleAspectFit];
[_answerImgBtn addTarget:self action:@selector(answerIAction) forControlEvents:UIControlEventTouchUpInside];
_answerImgBtn.center = CGPointMake((APP_SCREEN_WIDTH/4)*3, GetRealHeight(452) + Height66/2);
}
return _answerImgBtn;
}
-(void)answerIAction{
[self stopPlaySystemSound];
/// å¼€å¯å¯¹è®²
[self startTalk];
_answerImgBtn.hidden = YES;
_answerTextBtn.hidden = YES;
//æŒ‚æ–æŒ‰é’®ç§»åЍä¸é—´
_hangUpImgBtn.center = CGPointMake(APP_CONTENT_WIDTH/2, _hangUpImgBtn.center.y);
_hangUpTextBtn.center = CGPointMake(APP_CONTENT_WIDTH/2, _hangUpTextBtn.center.y);
[_hangUpTextBtn setTitle:hangUpStr forState:UIControlStateNormal];
//开始计时
_callTimeout = 0;
[self startCountdown];
isAnswer = YES;
if(self.mLCCallDelegate != NULL){
[self.mLCCallDelegate onAnswerAction];
}
}
-(void)setAnswerBtnEnable:(BOOL)ISEnable{
[_answerImgBtn setEnabled:ISEnable];
[_answerTextBtn setEnabled:ISEnable];
}
- (UIButton *)answerTextBtn{
if (_answerTextBtn == nil) {
_answerTextBtn = [[UIButton alloc] initWithFrame:CGRectMake(0, 0, GetRealWidth(100), GetRealWidth(20))];
[_answerTextBtn setTitle:@"接å¬" forState:UIControlStateNormal];
_answerTextBtn.titleLabel.font = [UIFont fontWithName:APP_UIFont size:14.0];
_answerTextBtn.titleLabel.textAlignment = NSTextAlignmentCenter;
// _unlockTextBtn.titleLabel.textColor = TextColor;
[_answerTextBtn setTitleColor:TextColor forState:UIControlStateNormal];
[_answerTextBtn setTitleColor:[UIColor lightGrayColor] forState:UIControlStateDisabled];
[_answerTextBtn setTitleColor:TextSelectColor forState:UIControlStateSelected];
[_answerTextBtn addTarget:self action:@selector(unlockAction) forControlEvents:UIControlEventTouchUpInside];
_answerTextBtn.center = CGPointMake(_answerImgBtn.center.x, GetRealHeight(530));
}
return _answerTextBtn;
}
- (UIButton *)calltimeBtn{
if (_calltimeBtn == nil) {
_calltimeBtn = [[UIButton alloc] initWithFrame:CGRectMake(0, 0, GetRealWidth(100), GetRealWidth(40))];
_calltimeBtn.backgroundColor = HEXCOLORA(0x000000, 0.6);
[_calltimeBtn setTitle:@"00:00" forState:UIControlStateNormal];
_calltimeBtn.titleLabel.font = [UIFont fontWithName:APP_UIFont size:14.0];
_calltimeBtn.titleLabel.textAlignment = NSTextAlignmentCenter;
[_calltimeBtn setTitleColor:[UIColor whiteColor] forState:UIControlStateNormal];
_calltimeBtn.hidden = YES;
_calltimeBtn.layer.cornerRadius = 12;
_calltimeBtn.center = CGPointMake(APP_CONTENT_WIDTH/2, GetRealWidth(340));
}
return _calltimeBtn;
}
-(void)ShowTime:(int)nowTime {
if(_calltimeBtn.hidden) _calltimeBtn.hidden = NO;
NSString *timeStr = [self timeFormatted:nowTime];
[self setCalltimeButtonText:timeStr isTime:YES];
}
-(void)ShowCalltimeBtn:(NSString*) mesStr {
if(_calltimeBtn.hidden) _calltimeBtn.hidden = NO;
[self setCalltimeButtonText:mesStr isTime:NO];
}
/*
æ ¹æ®æ–‡å—调整按钮宽
*/
-(void)setCalltimeButtonText:(NSString*) mesStr isTime:(BOOL)isTime
{
[_calltimeBtn setTitle:mesStr forState:UIControlStateNormal];
if(isTime){
_calltimeBtn.frame = CGRectMake(0, 0, GetRealWidth(80), GetRealWidth(30));
}else{
_calltimeBtn.frame = CGRectMake(0, 0, GetRealWidth(115), GetRealWidth(30));
}
_calltimeBtn.center = CGPointMake(APP_SCREEN_WIDTH/2, GetRealWidth(340));
}
- (NSString *)timeFormatted:(int)totalSeconds
{
int seconds = totalSeconds % 60;
int minutes = (totalSeconds / 60);
return [NSString stringWithFormat:@"%02d:%02d", minutes, seconds];
}
//- (int *)getTextWidth:(UIButton*) btn
//{
// int textWidth = 0;
// // Â CGSize size = [btn.titleLabel.textsizeWithFont:[UIFontboldSystemFontOfSize:15]constrainedToSize:contentMaxSizes lineBreakMode:UILineBreakModeCharacterWrap];
// // textWidth = (int)fontSize.Width;
// return textWidth;
//}
/** å¼€å¯å€’计时 */
- (void)startCountdown {
if (_callTimeout > 100) {
return;
}
_callTimeout = 0;
// GCD定时器
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
_countdownTimer = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0, queue);
dispatch_source_set_timer(_countdownTimer, dispatch_walltime(NULL, 0), 1.0 * NSEC_PER_SEC, 0); //æ¯ç§’执行
dispatch_source_set_event_handler(_countdownTimer, ^{
WEAKSELF_AT
if(weakSelf_AT.callTimeout >= 100 ){// 计时结æŸ
// å…³é—定时器
dispatch_source_cancel(weakSelf_AT.countdownTimer);
dispatch_async(dispatch_get_main_queue(), ^{
NSLog(@"è¶…æ—¶");
[weakSelf_AT backAction];
});
}else{// 计时ä¸
weakSelf_AT.callTimeout++;
dispatch_async(dispatch_get_main_queue(), ^{
[weakSelf_AT ShowTime:weakSelf_AT.callTimeout];
});
}
});
// å¼€å¯å®šæ—¶å™¨
dispatch_resume(_countdownTimer);
}
#pragma 开锿ˆåŠŸ
-(void)setOpenDoorSuccess{
[self setUnlock:NO];
_openDoorTimeout = 0;
[self startOpenDoorCountdown];
[self showUIAlertView:unlockSuccessfullyStr];
}
-(void)setUnlock:(BOOL)ISEnable{
[_unlockImgBtn setEnabled:ISEnable];
}
/** å¼€å¯å€’计时 */
- (void)startOpenDoorCountdown {
if (_openDoorTimeout > 20) {
return;
}
_openDoorTimeout = 0;
// GCD定时器
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
_openDoorTimer = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0, queue);
dispatch_source_set_timer(_openDoorTimer, dispatch_walltime(NULL, 0), 1.0 * NSEC_PER_SEC, 0); //æ¯ç§’执行
dispatch_source_set_event_handler(_openDoorTimer, ^{
WEAKSELF_AT
if(weakSelf_AT.openDoorTimeout >= 20 ){// 计时结æŸ
// å…³é—定时器
dispatch_source_cancel(weakSelf_AT.openDoorTimer);
dispatch_async(dispatch_get_main_queue(), ^{
[weakSelf_AT setUnlock:YES];
});
}else{// 计时ä¸
weakSelf_AT.openDoorTimeout++;
}
});
// å¼€å¯å®šæ—¶å™¨
dispatch_resume(_openDoorTimer);
}
#pragma SDKå¯è§†å¯¹è®² 功能部分
-(void)initESVideo{
// _es = ESVideo.shareInstance.es;
//åˆå§‹åŒ–䏿–,进入åŽå°çš„tag
[self.centerView addSubview:[self.playWindow getWindowView]];
_playing = NO;
_isSpeaking = NO;
self.isInterrupt = NO;
isBackGround = NO;
}
-(void)initData{
_titleUILabel.text = [[LCApiKit sharedInstance] currentDeviceName];
[_hangUpTextBtn setTitle:refuseStr forState:UIControlStateNormal];
[_answerTextBtn setTitle:answerStr forState:UIControlStateNormal];
}
///æ’æ”¾çª—壿‡’åŠ è½½
- (LCOpenSDK_PlayWindow *)playWindow {
if (!_playWindow) {
/** 1. åˆå§‹åŒ–æ’æ”¾çª—å£ä¿¡æ¯ï¼ŒåŒ…括ä½ç½®å¤§å°ä»¥åŠç´¢å¼• */
_playWindow = [[LCOpenSDK_PlayWindow alloc] initPlayWindow:CGRectMake(0, 0, [[UIScreen mainScreen] bounds].size.width, GetRealWidth(210)) Index:0];
/** 2. è®¾ç½®æ’æ”¾çª—å£èƒŒæ™¯è‰² */
[_playWindow setSurfaceBGColor:[UIColor blackColor]];
/** 3. æ·»åŠ æ’æ”¾çª—å£åˆ°çˆ¶è§†å›¾ */
// [self.view addSubview:[m_play getWindowView]];
/** 4. 设置监å¬å¯¹è±¡ï¼Œå¯ç›‘嬿’放结果回调 */
[_playWindow setWindowListener:(id<LCOpenSDK_EventListener>)self];
}
return _playWindow;
}
- (LCOpenSDK_AudioTalk *)talker {
if (!_talker) {
_talker = [LCOpenSDK_AudioTalk new];
[_talker setListener:self];
}
return _talker;
}
//- (void)onResignActive{
// if (self.playWindow) {
// [self.playWindow stopRtspReal:YES];
// // self.videoManager.isPlay = NO;
// [self.playWindow stopAudio];
// }
//}
/**
æš‚åœæ’放
*/
- (void)stopPlay {
if(self.playWindow){
[self.playWindow stopRtspReal:NO];
[self.playWindow stopAudio];
}
if(self.talker){
[self.talker stopTalk];
}
}
- (void)startPlay {
if(self.playWindow == NULL) return;
[self.playWindow stopRtspReal:NO];
[self.playWindow stopAudio];
/** 1. åˆå§‹åŒ–å®žæ—¶é¢„è§ˆæ’æ”¾å‚数对象 */
LCOpenSDK_ParamReal *paramReal = [[LCOpenSDK_ParamReal alloc] init];
/** 2. 设置token,tokenæ ¹æ®AppIdå’ŒAppSecretè°ƒç”¨ä¹æ©™äº‘开放平å°èŽ·å– */
paramReal.accessToken = [[LCApiKit sharedInstance] lcSdkToken];
/** 3. 设置设备åºåˆ—å· */
paramReal.deviceID = [[LCApiKit sharedInstance] currentDeviceId];
/** 4. 设置设备通é“,对于å•通é“设备为0, 对于NVRç‰å¤šé€šé“设备为具体通é“å· */
paramReal.channel = 0;
/** 5. è®¾ç½®ç æµæ¨¡å¼ï¼Œæ”¯æŒä¸»ç æµå’Œåç æµ */
paramReal.defiMode = DEFINITION_MODE_HG;
/** 6. 设置密钥,如果为用户自定义密钥为具体密钥, éžç”¨æˆ·è‡ªå®šå¯†é’¥å¯ä¸ºè®¾å¤‡åºåˆ—å·*/
paramReal.psk = [[LCApiKit sharedInstance] currentPsk];
/** 7. è®¾ç½®æ’æ”¾å¯†é’¥ï¼Œéžå¿…ä¼ ï¼Œä¼ äº†ä¼šæå‡æ‹‰æµé€Ÿåº¦ */
paramReal.playToken = [[LCApiKit sharedInstance] currentDevicePlayToken];;
/** 8. 是å¦èµ°æ‹‰æµä¼˜åŒ–,YES会æå‡æ‹‰æµé€Ÿåº¦ï¼Œå»ºè®®ä¼ YESå³å¯ */
paramReal.isOpt = YES;
/** 8. å¼€å§‹æ’æ”¾ */
[_playWindow playRtspReal:paramReal];
}
/// å¼€å¯å¯¹è®²
- (void)startTalk {
if (!isAnswer) {
//对讲开å¯
// [self.playWindow stopAudio];
if(self.talker == NULL) return;
[self.talker stopTalk];
LCOpenSDK_ParamTalk *param = [[LCOpenSDK_ParamTalk alloc]init];
param.isOpt = YES;
param.accessToken = [[LCApiKit sharedInstance] lcSdkToken];
/** 3. 设置设备åºåˆ—å· */
param.deviceID = [[LCApiKit sharedInstance] currentDeviceId];
/** 4. 设置设备通é“,对于å•通é“设备为0, 对于NVRç‰å¤šé€šé“设备为具体通é“å· */
param.channel = 0;
/** 6. 设置密钥,如果为用户自定义密钥为具体密钥, éžç”¨æˆ·è‡ªå®šå¯†é’¥å¯ä¸ºè®¾å¤‡åºåˆ—å·*/
param.psk = [[LCApiKit sharedInstance] currentPsk];
/** 7. è®¾ç½®æ’æ”¾å¯†é’¥ï¼Œéžå¿…ä¼ ï¼Œä¼ äº†ä¼šæå‡æ‹‰æµé€Ÿåº¦ */
param.playToken = [[LCApiKit sharedInstance] currentDevicePlayToken];;
NSInteger result = [self.talker playTalk:param];
if (result != 0) {
//错误处ç†
}
}
}
/**
开始å呼
*/
-(void)StartReverseCall{
[self startPlaySystemSound];
[self startPlay];
}
#pragma ***************************SDKListener***************************
/**
* è§†é¢‘æ’æ”¾çжæ€å›žè°ƒ
*
* @param code 错误ç (æ ¹æ®type而定)
* @param type 0, RTSP
* 1, HLS
* 99, OPENAPI
* @param index æ’æ”¾çª—å£ç´¢å¼•值
*/
/** 1. æ’æ”¾ç»“æžœå›žè°ƒï¼Œå¯æ ¹æ®é”™è¯¯ç 进行ä¸åŒå¤„ç† */
- (void)onPlayerResult:(NSString*)code Type:(NSInteger)type Index:(NSInteger)index {
// play
WEAKSELF_AT(self);
NSLog(@"LIVE_PLAY-CODE:%@,TYPE:%ld", code, (long)type);
//是å¦å·²ç»å¼¹çª—过
if(isShowErrorAlert) return;;
dispatch_async(dispatch_get_main_queue(), ^{
if (99 == type) {
if ([code isEqualToString:@"-1000"]) {
//"网络请求失败 (%ld)"
[weakSelf_AT showUIAlertViewWithBack:[NSString stringWithFormat:@"%@(%@)",self->endOfCallStr, code]];
} else if (![code isEqualToString:@"0"]) {
//"网络请求失败 (%ld)"
[weakSelf_AT showUIAlertViewWithBack:[NSString stringWithFormat:@"%@(%@)",self->endOfCallStr, code]];
} else {
//æˆåŠŸ
}
}
if (type == 5) {
if ([code integerValue] != 0 && [code integerValue] != STATE_DHHTTP_OK) {
[weakSelf_AT showUIAlertViewWithBack:[NSString stringWithFormat:@"%@(%@)",self->endOfCallStr, code]];
}
}
if (type == 0) {
if ([RTSP_Result_String(STATE_RTSP_DESCRIBE_READY) isEqualToString:code]) {
// dispatch_async(dispatch_get_main_queue(), ^{
// });
return;
}
if ([RTSP_Result_String(STATE_RTSP_PLAY_READY) isEqualToString:code]) {
// dispatch_async(dispatch_get_main_queue(), ^{
// });
return;
}
//æç¤ºå¤±è´¥
[weakSelf_AT showUIAlertViewWithBack:[NSString stringWithFormat:@"%@(%@)",self->endOfCallStr, code]];
}
});
return;
}
/** 2. æ’æ”¾å¼€å§‹å›žè°ƒ */
- (void)onPlayBegan:(NSInteger)index {
dispatch_async(dispatch_get_main_queue(), ^{
// self.videoManager.playStatus = 1001;
// [self saveThumbImage];
// [self hideVideoLoadImage];
});
}
/**
* è¯éŸ³å¯¹è®²çжæ€å›žè°ƒ
*
* @param error 错误ç
* @param type 0, RTSP
* 99, OPENAPI
*/
- (void)onTalkResult:(NSString *)error TYPE:(NSInteger)type
{
dispatch_async(dispatch_get_main_queue(), ^{
NSLog(@"å¼€å¯å¯¹è®²å›žè°ƒerror = %@, type = %ld", error, (long)type);
WEAKSELF_AT(self);
// [LCProgressHUD hideAllHuds:nil];
// if (99 == type) { //网络请求失败
//// dispatch_async(dispatch_get_main_queue(), ^{
//// weakself.videoManager.isOpenAudioTalk = NO;
//// [LCProgressHUD showMsg:@"play_module_video_preview_talk_failed".lc_T];
//// });
// return;
// }
// if (nil != error && [RTSP_Result_String(STATE_RTSP_DESCRIBE_READY) isEqualToString:error]) {
// dispatch_async(dispatch_get_main_queue(), ^{
// });
// return;
// }
// if (nil != error && [RTSP_Result_String(STATE_RTSP_PLAY_READY) isEqualToString:error]) {
// dispatch_async(dispatch_get_main_queue(), ^{
// //对讲连接æˆåŠŸå»ºç«‹
// self.videoManager.isOpenAudioTalk = YES;
// [LCProgressHUD showMsg:@"device_mid_open_talk_success".lc_T];
// });
// return;
// }
// dispatch_async(dispatch_get_main_queue(), ^{
// [LCProgressHUD showMsg:@"play_module_video_preview_talk_failed".lc_T];
// weakself.videoManager.isOpenAudioTalk = NO;
// });
});
}
////接å¬
//-(void)onAccept{
// if(_es){
// [_es onAccept];
// }else{
// NSLog(@"ESåˆå§‹åŒ–失败");
// }
//
//}
-(NSString *)getCurrentdateInterval
{
NSDate *datenow = [NSDate date];
NSString *timeSp = [NSString stringWithFormat:@"%ld", (long)([datenow timeIntervalSince1970]*1000)];
return timeSp;
}
-(void)showUIAlertView:(NSString *)mes
{
UIAlertController *alertController = [UIAlertController alertControllerWithTitle:tipStr message:mes preferredStyle:UIAlertControllerStyleAlert];
[alertController addAction:[UIAlertAction actionWithTitle:okStr style:UIAlertActionStyleCancel handler:nil]];
[self presentViewController:alertController animated:YES completion:nil];
// UIAlertView *alertView1 = [[UIAlertView alloc] initWithTitle:tipStr message:mes delegate:self cancelButtonTitle:okStr otherButtonTitles:nil, nil];
// [alertView1 show];
}
///
-(void)showUIAlertViewWithBack:(NSString *)mes
{
isShowErrorAlert = true;
UIAlertController *alertController = [UIAlertController alertControllerWithTitle:tipStr message:mes preferredStyle:UIAlertControllerStyleAlert];
[alertController addAction:[UIAlertAction actionWithTitle:okStr style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) {
[self backAction];
}]];
[self presentViewController:alertController animated:YES completion:nil];
}
///应用程会挂起 会调用 applicationWillResignActive 方法
- (void)onResignActive:(id)sender {
[self stopPlay];
}
#pragma viewDidAppear
-(void)viewDidAppear:(BOOL)animated{
//è¿™ä¸ªæ–¹æ³•è¯·æ ¹æ®App的具体情况调用
}
-(void)setIsInterrupt:(BOOL)isInterrupt{
// if (_es) {
// _es.isInterrupt = isInterrupt;
// }
}
-(void)viewWillDisappear:(BOOL)animated{
[super viewWillDisappear:animated];
[self stopPlaySystemSound];
//防æ¢ç”¨æˆ·ä¸æŒ‰æŒ‚æ–,或者ä¸ç‰æ”¶åˆ°å¯¹æ–¹çš„æŒ‚æ–,点击返回按钮。
//1.æš‚åœSDKç›¸å…³æ’æ”¾
[self stopPlay];
//2.Delegate释放
self.mLCCallDelegate = nil;
//3.定时器释放
if(_openDoorTimer){
dispatch_source_cancel(_openDoorTimer);
_openDoorTimer = nil; // OK
}
if(_countdownTimer){
dispatch_source_cancel(_countdownTimer);
_countdownTimer = nil; // OK
}
}
-(void)dealloc{
NSLog(@"==============dealloc 1");
[[NSNotificationCenter defaultCenter] removeObserver:self];
}
//#pragma mark ESVideoPhoneDelegate
////视频通è¯çš„状æ€ä»£ç†äº‹ä»¶ï¼ŒphoneEvent为返回的消æ¯é‡Œé¢åŒ…å«event状æ€ä¸Žä¸Ževent相关的数æ®
//-(void)getPhoneEvent_UI:(NSString *)phoneEvent{
// NSLog(@"事件%@", phoneEvent);
// NSArray *strArray = [phoneEvent componentsSeparatedByString:@"\r\n"];
// NSArray *eventArray = [strArray.firstObject componentsSeparatedByString:@"="];
// NSString *phoneEventStr = eventArray.lastObject;
//
// if([phoneEventStr isEqual:@"EVT_Ringing"]){
// // _es.showView.hidden = NO;
// //å呼æˆåŠŸ å…è®¸æŽ¥å¬ çœ‹éœ€æ±‚æ˜¯å¦éœ€è¦æ’放铃声和震动
// [self setAnswerBtnEnable:YES];
//
// // [_mCallOrAccept setTitle:@"接å¬" forState:UIControlStateNormal];
// }else if([phoneEventStr isEqual:@"EVT_StartStream"]){
//
// } else if([phoneEventStr isEqual:@"EVT_StopStream"]){
// // [_mCallOrAccept setTitle:@"å呼" forState:UIControlStateNormal];
// }else if([phoneEventStr isEqual:@"EVT_Connected"]){
//
// // [_mCallOrAccept setTitle:@"通è¯ä¸..." forState:UIControlStateNormal];
// }else if([phoneEventStr isEqual:@"EVT_HangUp"]){
// [self showUIAlertViewWithBack:@"已挂æ–"];
// // [_mCallOrAccept setTitle:@"å呼" forState:UIControlStateNormal];
// }else if([phoneEventStr isEqual:@"EVT_P2POnlineStatusChanged"]){
// //EVT_P2PStarted(p2påˆå§‹åŒ–OK,å¯ä»¥è¿žæŽ¥),EVT_P2POnlineStatusChangedonline=1
// //p2påˆå§‹åŒ–æˆåŠŸ,æ‰‹æœºç«¯ç›®å‰æ²¡æœ‰è¿™ä¸ªå›žè°ƒäº†
// //_mCallOrAccept.enabled = YES;
// //_monitorBtn.enabled = YES;
// }else if([phoneEventStr isEqual:@"EVT_RECV_CUSTOM_DATA"]){
// //开门的结果从这里返回
// NSString *baseStr = [strArray[1] substringFromIndex:5];
// NSData *data = [[NSData alloc]initWithBase64EncodedString:baseStr options:NSDataBase64DecodingIgnoreUnknownCharacters];
// NSDictionary *dic = [NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:nil];
// NSInteger status = [[dic valueForKey:@"status"]integerValue];
// if(status && status == 1){
// NSLog(@"开门æˆåŠŸ");
// [self setOpenDoorSuccess];
// }else{
// NSLog(@"开门失败");
// }
// }
//}
#pragma mark AudioSession与Notifications处ç†
-(void)InterruptionEndedAVAudioSessionSetActiveYES{
if (isBackGround) {
return;
}
if (self.isInterrupt == YES) {
[self startPlay];
self.isInterrupt = NO;
}
}
- (void)speaker:(UIButton *)sender {
// [_es stopTalk];
//
// NSString *result = nil;
// //å¬ç’çŠ¶æ€ æ’è€³å¡žåŽæ‹”æŽ‰åŽæ¢å¤åˆ°é»˜è®¤è®¾ç½®
// if (sender == nil) {
//// result = [_sessionHelper speaker:NO];
// [_es resetAudioCaptureIsSpeak:NO];
// }else{
// if(!_isSpeaking){
// [_es resetAudioCaptureIsSpeak:YES];
//// result = [_sessionHelper speaker:YES];
// _isSpeaking = YES;
// }else{
//// result = [_sessionHelper speaker:NO];
// [_es resetAudioCaptureIsSpeak:NO];
// _isSpeaking = NO;
// }
// }
// if (result) {
// [sender setTitle:result forState:UIControlStateNormal];
// [_es startTalk];
// }
}
/*
éœ€è¦æ³¨æ„çš„æ˜¯ï¼Œæœ‰ä¸€ä¸ªä¸æ–开始消æ¯ä¸ä¸€å®šä¼šæœ‰ä¸€ä¸ªä¸æ–ç»“æŸæ¶ˆæ¯ï¼Œè¿™å°±æ„味ç€ä¸æ–结æŸçš„回调里的处ç†é€»è¾‘å¯èƒ½ä¼šæ²¡æœ‰è¢«æ‰§è¡Œåˆ°ã€‚
所以需è¦å…³æ³¨å½“切到å‰å°è¿è¡ŒçŠ¶æ€æ—¶ï¼Œæ˜¯ä¸æ˜¯éœ€è¦é‡æ–°æ¿€æ´»ä½ çš„ Audio Session。
*/
- (void)willEnterForeground:(NSNotification*)notification{
NSLog(@"willEnterForeground");
//åˆæ¬¡å¯åŠ¨ä¼šèµ°è¿™ä¸ªé€šçŸ¥(æ ¹é¡µé¢),这时候是没有进入åŽå°çš„
if (isBackGround) {
return;
}
[self InterruptionEndedAVAudioSessionSetActiveYES];
}
///
- (void)willEnterBackground:(NSNotification *)notification {
isBackGround = YES;
}
#pragma ä¿å˜å›¾ç‰‡åˆ°ç›¸å†Œ
- (void)saveImageToPhotosAlbum:(UIImage *)savedImage
{
PHAuthorizationStatus status = [PHPhotoLibrary authorizationStatus];
if (status == PHAuthorizationStatusNotDetermined)
{
[PHPhotoLibrary requestAuthorization:^(PHAuthorizationStatus status) {
if(status == PHAuthorizationStatusAuthorized)
{
UIImageWriteToSavedPhotosAlbum(savedImage, self, @selector(imageSavedToPhotosAlbum:didFinishSavingWithError:contextInfo:), NULL);
}
}];
}
else
{
if (status == PHAuthorizationStatusAuthorized)
{
UIImageWriteToSavedPhotosAlbum(savedImage, self, @selector(imageSavedToPhotosAlbum:didFinishSavingWithError:contextInfo:), NULL);
}
}
}
// 指定回调方法
- (void)imageSavedToPhotosAlbum:(UIImage *)image didFinishSavingWithError:(NSError *)error contextInfo:(void *)contextInfo
{
NSString *message = nil;
if (!error) {
message = saveToTheAlbumsStr;
// 截图æˆåŠŸå›žè°ƒ
if(self.mLCCallDelegate != NULL){
[self.mLCCallDelegate onScreenshotSuccessfulAction:image];
}
}
else
{
message = operationFailedStr;
}
[self showUIAlertView:message];
}
/// ä¿å˜è§†é¢‘截图
- (void)saveThumbImage {
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSLibraryDirectory,
NSUserDomainMask, YES);
NSString *libraryDirectory = [paths objectAtIndex:0];
NSString *myDirectory =
[libraryDirectory stringByAppendingPathComponent:@"ON+"];
NSString *picDirectory =
[myDirectory stringByAppendingPathComponent:@"picture"];
NSDateFormatter *dataFormat = [[NSDateFormatter alloc] init];
[dataFormat setDateFormat:@"yyyyMMddHHmmss"];
NSString *strDate = [dataFormat stringFromDate:[NSDate date]];
NSString *datePath = [picDirectory stringByAppendingPathComponent:strDate];
NSString *picPath = [datePath stringByAppendingString:@".jpg"];
NSLog(@"test jpg name[%@]\n", picPath);
NSFileManager *fileManage = [NSFileManager defaultManager];
NSError *pErr;
BOOL isDir;
if (NO == [fileManage fileExistsAtPath:myDirectory isDirectory:&isDir]) {
[fileManage createDirectoryAtPath:myDirectory
withIntermediateDirectories:YES
attributes:nil
error:&pErr];
}
if (NO == [fileManage fileExistsAtPath:picDirectory isDirectory:&isDir]) {
[fileManage createDirectoryAtPath:picDirectory
withIntermediateDirectories:YES
attributes:nil
error:&pErr];
}
[self.playWindow snapShot:picPath];
UIImage *image = [UIImage imageWithContentsOfFile:picPath];
[self saveImageToPhotosAlbum:image];
}
#pragma 震动实现貌似和SDKå†²çª ä¸èƒ½å®žçŽ°éœ‡åŠ¨
//å¼€å§‹æ’æ”¾çš„æ—¶å€™è°ƒç”¨
-(void)startPlaySystemSound{
// return;
// //震动的æç¤ºæ–‡ä»¶å放到资æºç›®å½•下
// NSString *path = [[NSBundle mainBundle] pathForResource:@"ring" ofType:@"wav"];
// AudioServicesCreateSystemSoundID((__bridge CFURLRef)[NSURL fileURLWithPath:path], &sound);
//分别注册铃声和震动完åŽçš„回调
AudioServicesAddSystemSoundCompletion(kSystemSoundID_Vibrate, NULL, NULL, LCVibrationCompleteCallback, NULL);
// AudioServicesAddSystemSoundCompletion(sound, NULL, NULL, soundCompleteCallback, NULL);
AudioServicesPlaySystemSound(kSystemSoundID_Vibrate);//开始震动
// AudioServicesPlaySystemSound(sound);//å¼€å§‹æ’æ”¾é“ƒå£°
}
//æ‰‹åŠ¨åœæ¢æ’放的时候调用
- (void)stopPlaySystemSound{
// return;
NSLog(@"stop PlaySystemSound");
stopRingAndVibration();
}
//åœæ¢å“é“ƒå’Œéœ‡åŠ¨ï¼Œç§»é™¤å›žè°ƒå¹¶å¤„ç†æŽ‰é“ƒå£°å’Œéœ‡åŠ¨
void stopRingAndVibration() {
AudioServicesRemoveSystemSoundCompletion(kSystemSoundID_Vibrate);
// AudioServicesRemoveSystemSoundCompletion(sound);
AudioServicesDisposeSystemSoundID(kSystemSoundID_Vibrate);
// AudioServicesDisposeSystemSoundID(sound);
}
//震动完æˆå›žè°ƒï¼Œå› 为震动一下便会调用一次,这里延迟800mså†ç»§ç»éœ‡åŠ¨ï¼Œå’Œå¾®ä¿¡å·®ä¸å¤šï¼Œæ—¶é—´é•¿çŸå¯è‡ªå·±æŽ§åˆ¶ã€‚傿•°soundå³ä¸ºæ³¨å†Œå›žè°ƒæ—¶ä¼ çš„ç¬¬ä¸€ä¸ªå‚æ•°
void LCVibrationCompleteCallback(SystemSoundID sound,void * clientData) {
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(800 * NSEC_PER_MSEC)), dispatch_get_global_queue(0, 0), ^{
AudioServicesPlaySystemSound(sound);
});
}
////é“ƒå£°æ’æ”¾å®Œæˆå›žè°ƒï¼Œè¿™ç§æ–¹æ³•xæ’æ”¾çš„音频é™åˆ¶åœ¨30ç§’å†…ï¼Œæ’æ”¾å®Œç›´æŽ¥å“铃和震动
//void soundCompleteCallback(SystemSoundID sound,void * clientData) {
//
// stopRingAndVibration();
//}
///
- (void)addOpenSuccessAction {
[[NSNotificationCenter defaultCenter] removeObserver:self
name:LCCallDelegateOpenDoorSuccess
object:nil];
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(setOpenDoorSuccess)
name:LCCallDelegateOpenDoorSuccess
object:nil];
}
- (void)removeOpenSuccessAction {
[[NSNotificationCenter defaultCenter] removeObserver:self
name:LCCallDelegateOpenDoorSuccess
object:nil];
}
@end