443 lines
16 KiB
Objective-C
Executable File
443 lines
16 KiB
Objective-C
Executable File
//
|
|
// FirstViewController.m
|
|
// Talk
|
|
//
|
|
// Created by xuzs on 22/10/11.
|
|
// Copyright (c) 2022年 xuzs. All rights reserved.
|
|
//
|
|
|
|
#import "Call.h"
|
|
#import "UI.h"
|
|
#import "Pub.h"
|
|
#import "Opendoor.h"
|
|
#import "Sformat.h"
|
|
#import "Msg.h"
|
|
#import "AppDelegate.h"
|
|
|
|
@interface Call ()
|
|
@property (nonatomic, strong)UIView *rview,*spkView,*cutView,*hangupView,*openView;
|
|
@property (nonatomic, strong)UIImageView *playerImage,*spkImage,*cutImage,*hangupImage,*answerImage,*openImage;
|
|
@property (nonatomic, strong)UIScrollView *scrollView;
|
|
@property (nonatomic, strong)UIButton *answerView;
|
|
@property (nonatomic, strong)UILabel *statuLabel;
|
|
@property (nonatomic, strong)UIAlertController *openAlert;
|
|
@property (nonatomic, strong)NSTimer *timer;
|
|
@end
|
|
|
|
@implementation Call
|
|
|
|
- (void)viewDidLoad {
|
|
[super viewDidLoad];
|
|
// Do any additional setup after loading the view, typically from a nib.
|
|
[self.navigationController.navigationBar setHidden:YES];
|
|
[self setupViews];
|
|
[self setUI];
|
|
}
|
|
- (void)setupViews
|
|
{
|
|
|
|
self.edgesForExtendedLayout = UIRectEdgeNone;
|
|
self.extendedLayoutIncludesOpaqueBars = NO;
|
|
self.modalPresentationCapturesStatusBarAppearance = NO;
|
|
self.automaticallyAdjustsScrollViewInsets = NO;
|
|
[self.view addSubview:self.rview];
|
|
[self.rview addSubview:self.scrollView];
|
|
[self.scrollView addSubview:self.playerImage];
|
|
[self.rview addSubview:self.statuLabel];
|
|
|
|
|
|
if([_CallTag isEqualToString:@"BECALL"]){
|
|
[_statuLabel setText:[[NSString alloc] initWithFormat:@"%@呼叫",@"小小茜子的搬砖"]];
|
|
|
|
// [_statuLabel setText:[[NSString alloc] initWithFormat:@"%@呼叫",[Opendoor EquNameById:[[Pub getApp].talk getRemoteEqu]]]];
|
|
|
|
[self.rview addSubview:self.spkView];
|
|
[self.spkView addSubview:self.spkImage];
|
|
[self.rview addSubview:self.cutView];
|
|
[self.cutView addSubview:self.cutImage];
|
|
[self.rview addSubview:self.hangupView];
|
|
[self.hangupView addSubview:self.hangupImage];
|
|
[self.rview addSubview:self.answerView];
|
|
[self.answerView addSubview:self.answerImage];
|
|
[self.rview addSubview:self.openView];
|
|
[self.openView addSubview:self.openImage];
|
|
|
|
|
|
[self.cutView addGestureRecognizer:[[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(SaveImg)]];
|
|
[self.hangupView addGestureRecognizer:[[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(Hangup)]];
|
|
[self.answerView addGestureRecognizer:[[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(Answer)]];
|
|
[self.openView addGestureRecognizer:[[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(Open)]];
|
|
}
|
|
else if([_CallTag isEqualToString:@"WATCH"]){
|
|
[_statuLabel setText:[[NSString alloc] initWithFormat:@"监视%@",[Opendoor EquNameById:[[Pub getApp].talk getRemoteEqu]]]];
|
|
|
|
[self.rview addSubview:self.cutView];
|
|
[self.cutView addSubview:self.cutImage];
|
|
[self.rview addSubview:self.hangupView];
|
|
[self.hangupView addSubview:self.hangupImage];
|
|
[self.rview addSubview:self.openView];
|
|
[self.openView addSubview:self.openImage];
|
|
|
|
|
|
[self.cutView addGestureRecognizer:[[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(SaveImg)]];
|
|
[self.hangupView addGestureRecognizer:[[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(Hangup)]];
|
|
[self.openView addGestureRecognizer:[[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(Open)]];
|
|
}
|
|
|
|
}
|
|
- (void)setUI{
|
|
[UI SetRView:self.rview Top:@"0" Right:@"0" Bottom:@"0" Left:@"0"];
|
|
|
|
CGFloat imgwidth = [UI getScreenHeight]*640/480;
|
|
self.scrollView.contentSize=CGSizeMake(imgwidth, [UI getScreenHeight]);
|
|
self.playerImage.frame = CGRectMake(0,0,imgwidth, [UI getScreenHeight]);
|
|
[self.scrollView setContentOffset:CGPointMake((imgwidth-[UI getScreenWidth])/2, 0)];
|
|
[UI setFrameInView:self.statuLabel Width:@"100vw" Height:@"20" TranslateX:@"0" TranslateY:@"5vh" InView:nil Position:UITopMid];
|
|
|
|
if([_CallTag isEqualToString:@"BECALL"]){
|
|
[UI setFrameInView:self.spkView Width:@"14vmin" Height:@"14vmin" TranslateX:@"-36vmin" TranslateY:@"10vmin" InView:nil Position:UIBottomMid];
|
|
[UI setCornerRadius:self.spkView];
|
|
[UI setFrameInView:self.spkImage Width:@"50%" Height:@"50%" TranslateX:@"0" TranslateY:@"0" InView:nil Position:UICenter];
|
|
|
|
|
|
[UI setFrameInView:self.cutView Width:@"14vmin" Height:@"14vmin" TranslateX:@"-18vmin" TranslateY:@"10vmin" InView:nil Position:UIBottomMid];
|
|
[UI setCornerRadius:self.cutView];
|
|
[UI setFrameInView:self.cutImage Width:@"50%" Height:@"50%" TranslateX:@"0" TranslateY:@"0" InView:nil Position:UICenter];
|
|
|
|
|
|
[UI setFrameInView:self.hangupView Width:@"14vmin" Height:@"14vmin" TranslateX:@"0" TranslateY:@"10vmin" InView:nil Position:UIBottomMid];
|
|
[UI setCornerRadius:self.hangupView];
|
|
[UI setFrameInView:self.hangupImage Width:@"58%" Height:@"22%" TranslateX:@"0" TranslateY:@"0" InView:nil Position:UICenter];
|
|
|
|
|
|
[UI setFrameInView:self.answerView Width:@"14vmin" Height:@"14vmin" TranslateX:@"18vmin" TranslateY:@"10vmin" InView:nil Position:UIBottomMid];
|
|
[UI setCornerRadius:self.answerView];
|
|
[UI setFrameInView:self.answerImage Width:@"40%" Height:@"40%" TranslateX:@"0" TranslateY:@"0" InView:nil Position:UICenter];
|
|
|
|
|
|
[UI setFrameInView:self.openView Width:@"14vmin" Height:@"14vmin" TranslateX:@"36vmin" TranslateY:@"10vmin" InView:nil Position:UIBottomMid];
|
|
[UI setCornerRadius:self.openView];
|
|
[UI setFrameInView:self.openImage Width:@"35%" Height:@"40%" TranslateX:@"0" TranslateY:@"0" InView:nil Position:UICenter];
|
|
|
|
}
|
|
else if([_CallTag isEqualToString:@"WATCH"]){
|
|
[UI setFrameInView:self.cutView Width:@"14vmin" Height:@"14vmin" TranslateX:@"-26vmin" TranslateY:@"10vmin" InView:nil Position:UIBottomMid];
|
|
[UI setCornerRadius:self.cutView];
|
|
[UI setFrameInView:self.cutImage Width:@"50%" Height:@"50%" TranslateX:@"0" TranslateY:@"0" InView:nil Position:UICenter];
|
|
|
|
|
|
[UI setFrameInView:self.hangupView Width:@"14vmin" Height:@"14vmin" TranslateX:@"0" TranslateY:@"10vmin" InView:nil Position:UIBottomMid];
|
|
[UI setCornerRadius:self.hangupView];
|
|
[UI setFrameInView:self.hangupImage Width:@"58%" Height:@"22%" TranslateX:@"0" TranslateY:@"0" InView:nil Position:UICenter];
|
|
|
|
|
|
[UI setFrameInView:self.openView Width:@"14vmin" Height:@"14vmin" TranslateX:@"26vmin" TranslateY:@"10vmin" InView:nil Position:UIBottomMid];
|
|
[UI setCornerRadius:self.openView];
|
|
[UI setFrameInView:self.openImage Width:@"35%" Height:@"40%" TranslateX:@"0" TranslateY:@"0" InView:nil Position:UICenter];
|
|
|
|
[[Pub getApp].talk watchByServer];
|
|
}
|
|
|
|
}
|
|
- (void)setTime:(long)time0{
|
|
int sec_total = (int)([Sformat timestamp] - time0)/1000;
|
|
int sec = sec_total % 60;
|
|
int min = (sec_total-sec)/60;
|
|
//dispatch_async(dispatch_get_main_queue(), ^{//转到主线程处理
|
|
[self.statuLabel setText:[[NSString alloc] initWithFormat:@"%02d:%02d",min,sec]];
|
|
//});
|
|
|
|
}
|
|
- (void)SaveImg{
|
|
long time = [Sformat timestamp];
|
|
//
|
|
// NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES);
|
|
// // 构造保存文件的名称 保存成功会返回YES
|
|
// NSString *filePath = [[paths objectAtIndex:0]stringByAppendingPathComponent:
|
|
// [NSString stringWithFormat:@"%ld.jpg",time]];
|
|
|
|
NSString *path = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];// 拼接图⽚名为"currentImage.png"的路径
|
|
NSString *filePath = [path stringByAppendingPathComponent:[NSString stringWithFormat:@"%ld.jpg",time]];//获取⽹络请求中的url地址
|
|
|
|
|
|
//保存操作
|
|
BOOL result = [UIImageJPEGRepresentation(self.playerImage.image, .9) writeToFile:filePath atomically:YES];
|
|
if (result == YES) {
|
|
[self alert:@"保存截图成功"];
|
|
[[Pub getApp].sysinfo SaveRecord:time Type:@"截图" Equ:[[Pub getApp].talk getRemoteEqu] Img:[NSString stringWithFormat:@"%ld.jpg",time] Note:@""];
|
|
}else{
|
|
[self alert:@"保存截图失败"];
|
|
}
|
|
//https://wenku.baidu.com/view/2ff5463ba000a6c30c22590102020740be1ecd95.html
|
|
|
|
}
|
|
- (void)Hangup{
|
|
NSLog(@"挂机");
|
|
if([Pub getApp].talk.status>0){
|
|
if([_CallTag isEqualToString:@"BECALL"]){
|
|
[[Pub getApp].talk talkEnd];
|
|
}
|
|
else{
|
|
[[Pub getApp].talk watchEnd];
|
|
}
|
|
}
|
|
|
|
if([_CallTag isEqualToString:@"WATCH"]){
|
|
if([Pub getApp].talk.status==0){
|
|
[[Pub getApp].udp stopSend:@"" rr6:152 rr8:1];
|
|
}
|
|
}
|
|
[self UIClose];
|
|
}
|
|
- (void)UIClose{
|
|
[[Pub getApp].talk status_ini];
|
|
[self.presentingViewController dismissViewControllerAnimated:YES completion:nil];
|
|
[Pub getApp].callOut = nil;
|
|
|
|
}
|
|
- (void)Answer{
|
|
if([Pub getApp].talk.status==6){
|
|
NSLog(@"接听");
|
|
[Pub getApp].TalkSendAudio = false;
|
|
[[Pub getApp] ring_stop];
|
|
[[Pub getApp].talk talkOn];
|
|
|
|
}
|
|
else{
|
|
[self TouchUp];
|
|
}
|
|
|
|
|
|
}
|
|
|
|
//接听成功
|
|
- (void)AnswerSucc{
|
|
NSLog(@"接听Succ");
|
|
dispatch_async(dispatch_get_main_queue(), ^{//转到主线程处理
|
|
[self.answerImage setImage:[UIImage imageNamed:@"ic_vd_mic_off"]];
|
|
|
|
[self.answerView addTarget:self action:@selector(TouchDown) forControlEvents:UIControlEventTouchDown];
|
|
[self.answerView addTarget:self action:@selector(TouchUp) forControlEvents:UIControlEventTouchUpInside];
|
|
[self.answerView addTarget:self action:@selector(TouchUp) forControlEvents:UIControlEventTouchUpOutside];
|
|
|
|
});
|
|
}
|
|
-(void)TouchDown{
|
|
[self.answerImage setImage:[UIImage imageNamed:@"ic_vd_mic_on"]];
|
|
[Pub getApp].TalkSendAudio = true;
|
|
}
|
|
-(void)TouchUp{
|
|
[self.answerImage setImage:[UIImage imageNamed:@"ic_vd_mic_off"]];
|
|
[Pub getApp].TalkSendAudio = false;
|
|
|
|
}
|
|
- (void)Open{
|
|
self.openAlert = [Msg OpendoorByPwd:self SelectedHandler:^(int index) {
|
|
[self alert:@"请输入6位数字密码"];
|
|
}];
|
|
}
|
|
- (void)OpenDoorGo:(NSString *)pwd{
|
|
if(self.openAlert){
|
|
[self.openAlert dismissViewControllerAnimated:YES completion:nil];
|
|
[[Pub getApp].talk openDoor:pwd];
|
|
}
|
|
}
|
|
- (void)RefImg:(NSData *)data{
|
|
NSString *getStr = [self convertDataToHexStr:data];
|
|
NSLog(@"111得到的十六进制图像数据为:%@", getStr);
|
|
|
|
NSData *binaryData = [self dataFromHexString:getStr];
|
|
// 将NSData转换为二进制数组
|
|
const uint8_t *bytes = (const uint8_t *)[binaryData bytes];
|
|
NSUInteger length = [binaryData length];
|
|
NSMutableArray *binaryArray = [NSMutableArray array];
|
|
for (NSUInteger i = 0; i < length; i++) {
|
|
[binaryArray addObject:@(bytes[i])];
|
|
}
|
|
NSLog(@"222得到的二进制图像数据为:%@", binaryArray);
|
|
|
|
UIImage *image = [UIImage imageWithData: data];
|
|
//self.playerImage = [[UIImageView alloc] initWithImage:image];
|
|
[self.playerImage setImage:image];
|
|
}
|
|
|
|
//将NSData转换成十六进制的字符串则可使用如下方式:
|
|
- (NSString *)convertDataToHexStr:(NSData *)data {
|
|
if (!data || [data length] == 0) {
|
|
return @"";
|
|
}
|
|
NSMutableString *string = [[NSMutableString alloc] initWithCapacity:[data length]];
|
|
|
|
[data enumerateByteRangesUsingBlock:^(const void *bytes, NSRange byteRange, BOOL *stop) {
|
|
unsigned char *dataBytes = (unsigned char*)bytes;
|
|
for (NSInteger i = 0; i < byteRange.length; i++) {
|
|
NSString *hexStr = [NSString stringWithFormat:@"%x", (dataBytes[i]) & 0xff];
|
|
if ([hexStr length] == 2) {
|
|
[string appendString:hexStr];
|
|
} else {
|
|
[string appendFormat:@"0%@", hexStr];
|
|
}
|
|
}
|
|
}];
|
|
|
|
return string;
|
|
}
|
|
|
|
//将十六进制字符串转换为二进制数据
|
|
- (NSData *)dataFromHexString:(NSString *)hexString {
|
|
// 去除字符串中的空格和换行符
|
|
NSString *cleanedString = [hexString stringByReplacingOccurrencesOfString:@" " withString:@""];
|
|
cleanedString = [cleanedString stringByReplacingOccurrencesOfString:@"\n" withString:@""];
|
|
|
|
// 检查字符串长度是否为偶数
|
|
if (cleanedString.length % 2 != 0) {
|
|
// 如果长度为奇数,可以根据需要选择在字符串前面添加或去除一个字符
|
|
// 例如,你可以选择在前面添加一个零,或者去除最后一个字符
|
|
// cleanedString = [@"0" stringByAppendingString:cleanedString];
|
|
// 或者
|
|
// cleanedString = [cleanedString substringToIndex:cleanedString.length - 1];
|
|
}
|
|
|
|
// 使用一个循环将每两个字符转换为一个字节
|
|
NSMutableData *data = [NSMutableData data];
|
|
for (NSInteger i = 0; i < cleanedString.length; i += 2) {
|
|
NSString *byteString = [cleanedString substringWithRange:NSMakeRange(i, 2)];
|
|
NSScanner *scanner = [NSScanner scannerWithString:byteString];
|
|
unsigned int byteValue;
|
|
[scanner scanHexInt:&byteValue];
|
|
uint8_t byte = (uint8_t)byteValue;
|
|
[data appendBytes:&byte length:1];
|
|
}
|
|
|
|
return data;
|
|
}
|
|
|
|
- (void)didReceiveMemoryWarning {
|
|
[super didReceiveMemoryWarning];
|
|
// Dispose of any resources that can be recreated.
|
|
}
|
|
|
|
|
|
#pragma mark Property Accessors
|
|
- (UIView *)rview
|
|
{
|
|
if (!_rview) {
|
|
_rview = [[UIView alloc] init];
|
|
_rview.backgroundColor = [UIColor colorWithRed:0/255. green:0/255. blue:0/255. alpha:1];
|
|
}
|
|
return _rview;
|
|
}
|
|
- (UILabel *)statuLabel
|
|
{
|
|
if (!_statuLabel) {
|
|
_statuLabel = [[UILabel alloc] init];
|
|
_statuLabel.font = [UIFont systemFontOfSize:18.0f];
|
|
_statuLabel.textColor = [UIColor whiteColor];
|
|
_statuLabel.textAlignment = NSTextAlignmentCenter;
|
|
_statuLabel.text = NSLocalizedString(@"", nil);
|
|
}
|
|
return _statuLabel;
|
|
}
|
|
//免提
|
|
- (UIView *)spkView
|
|
{
|
|
if (!_spkView) {
|
|
_spkView = [[UIView alloc] init];
|
|
_spkView.backgroundColor = [UI colorWithHex:0x999999 alpha: .8];
|
|
}
|
|
return _spkView;
|
|
}
|
|
- (UIImageView *)spkImage
|
|
{
|
|
if (!_spkImage) {
|
|
_spkImage = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"hf"]];
|
|
}
|
|
return _spkImage;
|
|
}
|
|
//截图
|
|
- (UIView *)cutView
|
|
{
|
|
if (!_cutView) {
|
|
_cutView = [[UIView alloc] init];
|
|
_cutView.backgroundColor = [UI colorWithHex:0x999999 alpha: .8];
|
|
}
|
|
return _cutView;
|
|
}
|
|
- (UIImageView *)cutImage
|
|
{
|
|
if (!_cutImage) {
|
|
_cutImage = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"save_photo"]];
|
|
}
|
|
return _cutImage;
|
|
}
|
|
//挂机
|
|
- (UIView *)hangupView
|
|
{
|
|
if (!_hangupView) {
|
|
_hangupView = [[UIView alloc] init];
|
|
_hangupView.backgroundColor = [UI colorWithHex:0xff0000 alpha: .8];
|
|
|
|
}
|
|
return _hangupView;
|
|
}
|
|
- (UIImageView *)hangupImage
|
|
{
|
|
if (!_hangupImage) {
|
|
_hangupImage = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"hangup"]];
|
|
}
|
|
return _hangupImage;
|
|
}
|
|
//接听
|
|
- (UIButton *)answerView
|
|
{
|
|
if (!_answerView) {
|
|
_answerView = [[UIButton alloc] init];
|
|
_answerView.backgroundColor = [UI colorWithHex:0x2f6da8 alpha: .8];
|
|
}
|
|
return _answerView;
|
|
}
|
|
- (UIImageView *)answerImage
|
|
{
|
|
if (!_answerImage) {
|
|
_answerImage = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"call_call_on"]];
|
|
}
|
|
return _answerImage;
|
|
}
|
|
//开门
|
|
- (UIView *)openView
|
|
{
|
|
if (!_openView) {
|
|
_openView = [[UIView alloc] init];
|
|
_openView.backgroundColor = [UI colorWithHex:0x999999 alpha: .8];
|
|
}
|
|
return _openView;
|
|
}
|
|
- (UIImageView *)openImage
|
|
{
|
|
if (!_openImage) {
|
|
_openImage = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"unlock_on2"]];
|
|
}
|
|
return _openImage;
|
|
}
|
|
//播放画面
|
|
- (UIScrollView *)scrollView{
|
|
if(!_scrollView){
|
|
_scrollView = [[UIScrollView alloc] initWithFrame:CGRectMake(0, 0, [UI getScreenWidth], [UI getScreenHeight])];
|
|
_scrollView.pagingEnabled = NO;
|
|
_scrollView.showsHorizontalScrollIndicator = YES;
|
|
_scrollView.showsVerticalScrollIndicator = NO;
|
|
_scrollView.delegate = self;
|
|
}
|
|
return _scrollView;
|
|
}
|
|
|
|
- (UIImageView *)playerImage
|
|
{
|
|
if (!_playerImage) {
|
|
//_playerImage = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"test.jpg"]];
|
|
_playerImage = [[UIImageView alloc] init];
|
|
}
|
|
return _playerImage;
|
|
}
|
|
@end
|