Browse Source

1.录音功能部分UI

huangxiaodong 2 months ago
parent
commit
718d1daffd
35 changed files with 1122 additions and 5 deletions
  1. 22 0
      创维盒子/code/Assets.xcassets/mine/record_backward_icon.imageset/Contents.json
  2. BIN
      创维盒子/code/Assets.xcassets/mine/record_backward_icon.imageset/record_backward_icon@2x.png
  3. BIN
      创维盒子/code/Assets.xcassets/mine/record_backward_icon.imageset/record_backward_icon@3x.png
  4. 22 0
      创维盒子/code/Assets.xcassets/mine/record_delete_icon.imageset/Contents.json
  5. BIN
      创维盒子/code/Assets.xcassets/mine/record_delete_icon.imageset/record_delete_icon@2x.png
  6. BIN
      创维盒子/code/Assets.xcassets/mine/record_delete_icon.imageset/record_delete_icon@3x.png
  7. 22 0
      创维盒子/code/Assets.xcassets/mine/record_edit_icon.imageset/Contents.json
  8. BIN
      创维盒子/code/Assets.xcassets/mine/record_edit_icon.imageset/record_edit_icon@2x.png
  9. BIN
      创维盒子/code/Assets.xcassets/mine/record_edit_icon.imageset/record_edit_icon@3x.png
  10. 22 0
      创维盒子/code/Assets.xcassets/mine/record_forward_icon.imageset/Contents.json
  11. BIN
      创维盒子/code/Assets.xcassets/mine/record_forward_icon.imageset/record_forward_icon@2x.png
  12. BIN
      创维盒子/code/Assets.xcassets/mine/record_forward_icon.imageset/record_forward_icon@3x.png
  13. 22 0
      创维盒子/code/Assets.xcassets/mine/record_pause_icon.imageset/Contents.json
  14. BIN
      创维盒子/code/Assets.xcassets/mine/record_pause_icon.imageset/record_pause_icon@2x.png
  15. BIN
      创维盒子/code/Assets.xcassets/mine/record_pause_icon.imageset/record_pause_icon@3x.png
  16. 22 0
      创维盒子/code/Assets.xcassets/mine/record_player_icon.imageset/Contents.json
  17. BIN
      创维盒子/code/Assets.xcassets/mine/record_player_icon.imageset/record_player_icon@2x.png
  18. BIN
      创维盒子/code/Assets.xcassets/mine/record_player_icon.imageset/record_player_icon@3x.png
  19. 22 0
      创维盒子/code/Assets.xcassets/mine/recording_tip.imageset/Contents.json
  20. BIN
      创维盒子/code/Assets.xcassets/mine/recording_tip.imageset/recording_tip@2x.png
  21. BIN
      创维盒子/code/Assets.xcassets/mine/recording_tip.imageset/recording_tip@3x.png
  22. 22 0
      创维盒子/code/Assets.xcassets/mine/white_record_end_icon.imageset/Contents.json
  23. BIN
      创维盒子/code/Assets.xcassets/mine/white_record_end_icon.imageset/white_record_end_icon@2x.png
  24. BIN
      创维盒子/code/Assets.xcassets/mine/white_record_end_icon.imageset/white_record_end_icon@3x.png
  25. 31 0
      创维盒子/code/mine/AudioRecorderManager/AudioRecorderManager.h
  26. 130 0
      创维盒子/code/mine/AudioRecorderManager/AudioRecorderManager.m
  27. 23 0
      创维盒子/code/mine/model/recordFileModel.h
  28. 12 0
      创维盒子/code/mine/model/recordFileModel.m
  29. 276 3
      创维盒子/code/mine/recordViewController.m
  30. 17 0
      创维盒子/code/mine/view/recordFileCell.h
  31. 286 0
      创维盒子/code/mine/view/recordFileCell.m
  32. 18 0
      创维盒子/code/mine/view/recordingView.h
  33. 86 0
      创维盒子/code/mine/view/recordingView.m
  34. 1 0
      创维盒子/code/zh-Hans.lproj/Localizable.strings
  35. 66 2
      创维盒子/双子星云手机.xcodeproj/project.pbxproj

+ 22 - 0
创维盒子/code/Assets.xcassets/mine/record_backward_icon.imageset/Contents.json

@@ -0,0 +1,22 @@
+{
+  "images" : [
+    {
+      "idiom" : "universal",
+      "scale" : "1x"
+    },
+    {
+      "filename" : "record_backward_icon@2x.png",
+      "idiom" : "universal",
+      "scale" : "2x"
+    },
+    {
+      "filename" : "record_backward_icon@3x.png",
+      "idiom" : "universal",
+      "scale" : "3x"
+    }
+  ],
+  "info" : {
+    "author" : "xcode",
+    "version" : 1
+  }
+}

BIN
创维盒子/code/Assets.xcassets/mine/record_backward_icon.imageset/record_backward_icon@2x.png


BIN
创维盒子/code/Assets.xcassets/mine/record_backward_icon.imageset/record_backward_icon@3x.png


+ 22 - 0
创维盒子/code/Assets.xcassets/mine/record_delete_icon.imageset/Contents.json

@@ -0,0 +1,22 @@
+{
+  "images" : [
+    {
+      "idiom" : "universal",
+      "scale" : "1x"
+    },
+    {
+      "filename" : "record_delete_icon@2x.png",
+      "idiom" : "universal",
+      "scale" : "2x"
+    },
+    {
+      "filename" : "record_delete_icon@3x.png",
+      "idiom" : "universal",
+      "scale" : "3x"
+    }
+  ],
+  "info" : {
+    "author" : "xcode",
+    "version" : 1
+  }
+}

BIN
创维盒子/code/Assets.xcassets/mine/record_delete_icon.imageset/record_delete_icon@2x.png


BIN
创维盒子/code/Assets.xcassets/mine/record_delete_icon.imageset/record_delete_icon@3x.png


+ 22 - 0
创维盒子/code/Assets.xcassets/mine/record_edit_icon.imageset/Contents.json

@@ -0,0 +1,22 @@
+{
+  "images" : [
+    {
+      "idiom" : "universal",
+      "scale" : "1x"
+    },
+    {
+      "filename" : "record_edit_icon@2x.png",
+      "idiom" : "universal",
+      "scale" : "2x"
+    },
+    {
+      "filename" : "record_edit_icon@3x.png",
+      "idiom" : "universal",
+      "scale" : "3x"
+    }
+  ],
+  "info" : {
+    "author" : "xcode",
+    "version" : 1
+  }
+}

BIN
创维盒子/code/Assets.xcassets/mine/record_edit_icon.imageset/record_edit_icon@2x.png


BIN
创维盒子/code/Assets.xcassets/mine/record_edit_icon.imageset/record_edit_icon@3x.png


+ 22 - 0
创维盒子/code/Assets.xcassets/mine/record_forward_icon.imageset/Contents.json

@@ -0,0 +1,22 @@
+{
+  "images" : [
+    {
+      "idiom" : "universal",
+      "scale" : "1x"
+    },
+    {
+      "filename" : "record_forward_icon@2x.png",
+      "idiom" : "universal",
+      "scale" : "2x"
+    },
+    {
+      "filename" : "record_forward_icon@3x.png",
+      "idiom" : "universal",
+      "scale" : "3x"
+    }
+  ],
+  "info" : {
+    "author" : "xcode",
+    "version" : 1
+  }
+}

BIN
创维盒子/code/Assets.xcassets/mine/record_forward_icon.imageset/record_forward_icon@2x.png


BIN
创维盒子/code/Assets.xcassets/mine/record_forward_icon.imageset/record_forward_icon@3x.png


+ 22 - 0
创维盒子/code/Assets.xcassets/mine/record_pause_icon.imageset/Contents.json

@@ -0,0 +1,22 @@
+{
+  "images" : [
+    {
+      "idiom" : "universal",
+      "scale" : "1x"
+    },
+    {
+      "filename" : "record_pause_icon@2x.png",
+      "idiom" : "universal",
+      "scale" : "2x"
+    },
+    {
+      "filename" : "record_pause_icon@3x.png",
+      "idiom" : "universal",
+      "scale" : "3x"
+    }
+  ],
+  "info" : {
+    "author" : "xcode",
+    "version" : 1
+  }
+}

BIN
创维盒子/code/Assets.xcassets/mine/record_pause_icon.imageset/record_pause_icon@2x.png


BIN
创维盒子/code/Assets.xcassets/mine/record_pause_icon.imageset/record_pause_icon@3x.png


+ 22 - 0
创维盒子/code/Assets.xcassets/mine/record_player_icon.imageset/Contents.json

@@ -0,0 +1,22 @@
+{
+  "images" : [
+    {
+      "idiom" : "universal",
+      "scale" : "1x"
+    },
+    {
+      "filename" : "record_player_icon@2x.png",
+      "idiom" : "universal",
+      "scale" : "2x"
+    },
+    {
+      "filename" : "record_player_icon@3x.png",
+      "idiom" : "universal",
+      "scale" : "3x"
+    }
+  ],
+  "info" : {
+    "author" : "xcode",
+    "version" : 1
+  }
+}

BIN
创维盒子/code/Assets.xcassets/mine/record_player_icon.imageset/record_player_icon@2x.png


BIN
创维盒子/code/Assets.xcassets/mine/record_player_icon.imageset/record_player_icon@3x.png


+ 22 - 0
创维盒子/code/Assets.xcassets/mine/recording_tip.imageset/Contents.json

@@ -0,0 +1,22 @@
+{
+  "images" : [
+    {
+      "idiom" : "universal",
+      "scale" : "1x"
+    },
+    {
+      "filename" : "recording_tip@2x.png",
+      "idiom" : "universal",
+      "scale" : "2x"
+    },
+    {
+      "filename" : "recording_tip@3x.png",
+      "idiom" : "universal",
+      "scale" : "3x"
+    }
+  ],
+  "info" : {
+    "author" : "xcode",
+    "version" : 1
+  }
+}

BIN
创维盒子/code/Assets.xcassets/mine/recording_tip.imageset/recording_tip@2x.png


BIN
创维盒子/code/Assets.xcassets/mine/recording_tip.imageset/recording_tip@3x.png


+ 22 - 0
创维盒子/code/Assets.xcassets/mine/white_record_end_icon.imageset/Contents.json

@@ -0,0 +1,22 @@
+{
+  "images" : [
+    {
+      "idiom" : "universal",
+      "scale" : "1x"
+    },
+    {
+      "filename" : "white_record_end_icon@2x.png",
+      "idiom" : "universal",
+      "scale" : "2x"
+    },
+    {
+      "filename" : "white_record_end_icon@3x.png",
+      "idiom" : "universal",
+      "scale" : "3x"
+    }
+  ],
+  "info" : {
+    "author" : "xcode",
+    "version" : 1
+  }
+}

BIN
创维盒子/code/Assets.xcassets/mine/white_record_end_icon.imageset/white_record_end_icon@2x.png


BIN
创维盒子/code/Assets.xcassets/mine/white_record_end_icon.imageset/white_record_end_icon@3x.png


+ 31 - 0
创维盒子/code/mine/AudioRecorderManager/AudioRecorderManager.h

@@ -0,0 +1,31 @@
+//
+//  AudioRecorderManager.h
+//  双子星云手机
+//
+//  Created by xd h on 2025/3/28.
+//
+
+#import <Foundation/Foundation.h>
+#import <AVFoundation/AVFoundation.h>
+
+NS_ASSUME_NONNULL_BEGIN
+
+@interface AudioRecorderManager : NSObject<AVAudioRecorderDelegate>
+
+@property (nonatomic, strong) AVAudioRecorder *audioRecorder;
+@property (nonatomic, strong) AVAudioPlayer *audioPlayer;
+@property (nonatomic, copy) NSString *recordedFilePath;
+
++ (instancetype)sharedManager;
+
+- (void)startRecording;
+- (void)stopRecording;
+- (void)playRecording;
+- (void)stopPlaying;
+- (BOOL)isRecording;
+- (BOOL)isPlaying;
+
+
+@end
+
+NS_ASSUME_NONNULL_END

+ 130 - 0
创维盒子/code/mine/AudioRecorderManager/AudioRecorderManager.m

@@ -0,0 +1,130 @@
+//
+//  AudioRecorderManager.m
+//  双子星云手机
+//
+//  Created by xd h on 2025/3/28.
+//
+
+#import "AudioRecorderManager.h"
+
+@implementation AudioRecorderManager
+
++ (instancetype)sharedManager {
+    static AudioRecorderManager *sharedInstance = nil;
+    static dispatch_once_t onceToken;
+    dispatch_once(&onceToken, ^{
+        sharedInstance = [[self alloc] init];
+    });
+    return sharedInstance;
+}
+
+- (instancetype)init {
+    self = [super init];
+    if (self) {
+        [self setupAudioSession];
+    }
+    return self;
+}
+
+- (void)setupAudioSession {
+    AVAudioSession *audioSession = [AVAudioSession sharedInstance];
+    NSError *error = nil;
+    [audioSession setCategory:AVAudioSessionCategoryPlayAndRecord error:&error];
+    [audioSession setActive:YES error:&error];
+    
+    if (error) {
+        NSLog(@"Audio Session error: %@", error.localizedDescription);
+    }
+}
+
+- (void)startRecording {
+    if ([self isRecording]) {
+        [self stopRecording];
+        return;
+    }
+    
+    // 设置录音文件路径
+    NSString *documentsPath = kSHPath_Record;
+    self.recordedFilePath = [documentsPath stringByAppendingPathComponent:@"recording.m4a"];
+    NSURL *outputFileURL = [NSURL fileURLWithPath:self.recordedFilePath];
+    
+    // 录音设置
+    NSDictionary *recordSettings = @{
+        AVFormatIDKey: @(kAudioFormatMPEG4AAC),
+        AVSampleRateKey: @44100.0,
+        AVNumberOfChannelsKey: @2,
+        AVEncoderAudioQualityKey: @(AVAudioQualityHigh)
+    };
+    
+    NSError *error = nil;
+    self.audioRecorder = [[AVAudioRecorder alloc] initWithURL:outputFileURL settings:recordSettings error:&error];
+    self.audioRecorder.delegate = self;
+    
+    if (error) {
+        NSLog(@"Audio Recorder error: %@", error.localizedDescription);
+    } else {
+        [self.audioRecorder prepareToRecord];
+        [self.audioRecorder record];
+        NSLog(@"Recording started");
+    }
+}
+
+- (void)stopRecording {
+    if ([self isRecording]) {
+        [self.audioRecorder stop];
+        self.audioRecorder = nil;
+        NSLog(@"Recording stopped");
+    }
+}
+
+- (void)playRecording {
+    if ([self isPlaying]) {
+        [self stopPlaying];
+        return;
+    }
+    
+    if (!self.recordedFilePath) {
+        NSLog(@"No recording to play");
+        return;
+    }
+    
+    NSError *error = nil;
+    self.audioPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:[NSURL fileURLWithPath:self.recordedFilePath] error:&error];
+    self.audioPlayer.numberOfLoops = 0;
+    
+    if (error) {
+        NSLog(@"Audio Player error: %@", error.localizedDescription);
+    } else {
+        [self.audioPlayer play];
+        NSLog(@"Playing recording");
+    }
+}
+
+- (void)stopPlaying {
+    if ([self isPlaying]) {
+        [self.audioPlayer stop];
+        self.audioPlayer = nil;
+        NSLog(@"Playback stopped");
+    }
+}
+
+- (BOOL)isRecording {
+    return self.audioRecorder && self.audioRecorder.isRecording;
+}
+
+- (BOOL)isPlaying {
+    return self.audioPlayer && self.audioPlayer.isPlaying;
+}
+
+#pragma mark - AVAudioRecorderDelegate
+
+- (void)audioRecorderDidFinishRecording:(AVAudioRecorder *)recorder successfully:(BOOL)flag {
+    if (flag) {
+        NSLog(@"Recording finished successfully");
+    } else {
+        NSLog(@"Recording failed");
+    }
+    self.audioRecorder = nil;
+}
+
+@end

+ 23 - 0
创维盒子/code/mine/model/recordFileModel.h

@@ -0,0 +1,23 @@
+//
+//  recordFileModel.h
+//  双子星云手机
+//
+//  Created by xd h on 2025/3/28.
+//
+
+#import "SuperModel.h"
+
+NS_ASSUME_NONNULL_BEGIN
+
+@interface recordFileModel : SuperModel
+@property (nonatomic, copy) NSString *fileName;//文件名
+@property (nonatomic, copy) NSString *filePath;//路径
+@property (nonatomic, assign) unsigned long long fileSize;// 文件大小
+@property (nonatomic, assign) BOOL isDirectory;//文件是否存在
+@property (nonatomic, strong) NSDate *modificationDate;//最后修改日志
+@property (nonatomic, assign) NSInteger totalTime;// 录音时长
+
+@property (nonatomic, assign) BOOL showAllType;// 是否展示全部内容
+@end
+
+NS_ASSUME_NONNULL_END

+ 12 - 0
创维盒子/code/mine/model/recordFileModel.m

@@ -0,0 +1,12 @@
+//
+//  recordFileModel.m
+//  双子星云手机
+//
+//  Created by xd h on 2025/3/28.
+//
+
+#import "recordFileModel.h"
+
+@implementation recordFileModel
+
+@end

+ 276 - 3
创维盒子/code/mine/recordViewController.m

@@ -7,10 +7,16 @@
 
 #import "recordViewController.h"
 #import "recordBottomView.h"
+#import "recordingView.h"
+#import <AVFoundation/AVFoundation.h>
+#import "recordFileModel.h"
+#import "recordFileCell.h"
 
-@interface recordViewController ()
+@interface recordViewController ()<UITableViewDelegate,UITableViewDataSource,DZNEmptyDataSetSource, DZNEmptyDataSetDelegate>
+@property (nonatomic, strong) UITableView *tableView;
 @property(nonatomic,strong)NSMutableArray *audioArr;//音频数据
 @property(nonatomic,strong)recordBottomView *recordBottomV;//底部视图
+@property(nonatomic,strong)recordingView *recordingV;//录音中
 @end
 
 @implementation recordViewController
@@ -31,7 +37,7 @@
     [self.navigationBar setHidden:YES];
     [self.toolBar setHidden:YES];
     [self.titleLabel setText:NSLocalizedString(@"mine_record_title",nil)];
-    
+        
     //底部视图
     _recordBottomV = [[recordBottomView alloc] init];
     [self.view addSubview:_recordBottomV];
@@ -46,8 +52,151 @@
     _recordBottomV.didClickRecordFun = ^{
         [weakSelf didClickRecordFun];
     };
+    
+    [self.view addSubview:self.tableView];
+    [self.tableView mas_makeConstraints:^(MASConstraintMaker *make) {
+        make.left.mas_equalTo(0);
+        make.right.mas_equalTo(0);
+        make.bottom.equalTo(self.recordBottomV.mas_top).offset(0.f);
+        //make.bottom.mas_equalTo(0);
+        make.top.equalTo(self.navBarBGView.mas_bottom).offset(10.f);
+    }];
+}
+
+#pragma mark - 懒加载
+- (UITableView *)tableView{
+    if (!_tableView) {
+        _tableView = [[UITableView alloc] initWithFrame:CGRectMake(0, 0, SCREEN_W, SCREEN_H - TABBARHEIGHT) style:UITableViewStylePlain];
+        _tableView.delegate = self;
+        _tableView.dataSource = self;
+        _tableView.showsVerticalScrollIndicator = NO;
+        _tableView.showsHorizontalScrollIndicator = NO;
+//        _tableView.contentInset = UIEdgeInsetsMake(-H_STATE_BAR, 0, 0, 0);
+        [_tableView setSeparatorStyle:(UITableViewCellSeparatorStyleNone)];
+        [_tableView setSeparatorColor:[UIColor clearColor]];
+        [_tableView setBackgroundColor:[UIColor clearColor]];
+        [_tableView setTableFooterView:[UIView new]];
+        [_tableView setBounces:YES];
+        
+        if (@available(iOS 15.0, *)) {
+            _tableView.sectionHeaderTopPadding = 0;
+        }
+        
+        //空数据引入第三方开源处理
+        _tableView.emptyDataSetSource = self;
+        _tableView.emptyDataSetDelegate = self;
+        
+        // 下拉追加
+//        MJRefreshAutoNormalFooter *footer = [MJRefreshAutoNormalFooter footerWithRefreshingBlock:^{
+//            [self getMoreNetWorkData];
+//        }];
+//
+//        NSString *text =  NSLocalizedString(@"NAS_bottom_tip",nil);
+//        [footer setTitle:text forState:MJRefreshStateNoMoreData];
+//        _tableView.mj_footer = footer;
+    }
+    
+    return _tableView;
+}
+
+#pragma mark - 列表委托
+- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView{
+    return 1;
+}
+
+- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
+    if(!_audioArr){
+        return 0;
+    }
+    return _audioArr.count;
+}
+
+- (recordFileCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
+    
+    __block NSInteger row = indexPath.row;
+    static NSString *identifier = @"recordFileCell";
+    
+    recordFileCell * cell =  [tableView dequeueReusableCellWithIdentifier:identifier];
+    cell.selectionStyle = UITableViewCellSelectionStyleNone;
+    if (!cell){
+        cell = [[recordFileCell alloc] initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:identifier];
+        [cell setSelectionStyle:UITableViewCellSelectionStyleNone];
+        [cell setBackgroundColor:[UIColor clearColor]];
+        [cell setAccessoryType:(UITableViewCellAccessoryNone)];
+        
+        
+    }
+    
+    if(row < _audioArr.count){
+        recordFileModel* dataModel = _audioArr[row];
+        cell.curRecordFileModel = dataModel;
+//
+//        KWeakSelf
+//        cell.didClickSwitch = ^(BOOL SwitchOn) {
+//            //if([weakSelf userCheckFileModel:dataModel withShowTip:YES]){
+//                [weakSelf userCheckFilePreviewByRow:row];
+//            //}
+//        };
+    }
+    return cell;
+}
+
+- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{
+    
+    NSInteger row = indexPath.row;
+    if(row >=_audioArr.count){
+        return 0.0;
+    }
+    
+    recordFileModel *model = _audioArr[row];
+    if (model.showAllType) {
+        return 150;
+    }
+    
+    return 65;
 }
 
+- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
+{
+    NSInteger row = indexPath.row;
+//    if(row < _curNASFileAudioMod.data.list.count){
+//        
+//        NASFilePicDataArrModel *dataModel = _curNASFileAudioMod.data.list[row];
+//        //videoPlayViewController *vc = [videoPlayViewController new];
+//        videoPlayByAVPlayerViewController *vc = [videoPlayByAVPlayerViewController new];
+//        vc.VideoDataMode = dataModel;
+//        [self.navigationController pushViewController:vc animated:YES];
+//        
+//        KWeakSelf
+//        vc.didNeedDeleteFile = ^(NSString * _Nonnull filePath) {
+//            [weakSelf deleteNetDataByFilePath:filePath];
+//        };
+//    }
+}
+
+#pragma mark 空数据
+- (UIImage *)imageForEmptyDataSet:(UIScrollView *)scrollView {
+    
+    NSString *imageName = @"common_no_data_pic";
+    
+    return [UIImage imageNamed:imageName];
+}
+
+- (NSAttributedString *)titleForEmptyDataSet:(UIScrollView *)scrollView {
+    NSString *text = NSLocalizedString(@"common_no_data_tip",nil);
+    
+    NSDictionary *attributes = @{NSFontAttributeName: [UIFont systemFontOfSize:16.0f],
+                                 NSForegroundColorAttributeName: HW999999Color};
+    
+    return [[NSAttributedString alloc] initWithString:text attributes:attributes];
+}
+
+//调整图片位置
+- (CGFloat)verticalOffsetForEmptyDataSet:(UIScrollView *)scrollView {
+    return -150;
+}
+
+
 #pragma mark 读取本地数据
 - (void)getRecordDataFun
 {
@@ -61,13 +210,137 @@
         HLog(@"Error reading contents of directory: %@", error.localizedDescription);
     }
     
-    _audioArr = [NSMutableArray arrayWithArray:fileList];
+    BOOL isFirstType = YES;
+    
+    for (NSString *fileName in fileList) {
+        NSString *filePath = [documentsDirectory stringByAppendingPathComponent:fileName];
+        
+        // 获取文件属性
+        NSDictionary *fileAttributes = [fileManager attributesOfItemAtPath:filePath error:&error];
+        if (error) {
+            NSLog(@"获取文件属性出错: %@ - %@", fileName, error.localizedDescription);
+            error = nil;
+            continue;
+        }
+        
+        // 判断是否是目录
+        BOOL isDirectory = [fileAttributes[NSFileType] isEqualToString:NSFileTypeDirectory];
+        
+        // 获取文件大小
+        unsigned long long fileSize = [fileAttributes[NSFileSize] unsignedLongLongValue];
+        
+        recordFileModel *model =  [recordFileModel new];
+        model.fileName = fileName;
+        model.filePath = filePath;
+        model.fileSize = fileSize;
+        model.isDirectory = isDirectory;
+        model.modificationDate = fileAttributes[NSFileModificationDate] ?: [NSDate date];
+        
+        NSURL *fileUrl = [NSURL URLWithString:model.filePath];
+        NSTimeInterval time  = [self getDurationOfAudioFile:fileUrl];
+        model.totalTime =  (NSInteger)ceil(time);  // 结果为 5;
+        
+        if (isFirstType) {
+            model.showAllType  = YES;
+        }
+        
+        // 创建文件信息字典
+//        NSDictionary *fileInfo = @{
+//            @"name": fileName,
+//            @"path": filePath,
+//            @"size": @(fileSize),
+//            @"isDirectory": @(isDirectory),
+//            @"modificationDate": fileAttributes[NSFileModificationDate] ?: [NSDate date]
+//        };
+        
+        [_audioArr addObject:model];
+    }
+    
+}
+
+#pragma mark 获取录音文件的时长
+- (NSTimeInterval)getDurationOfAudioFile:(NSURL *)fileURL {
+    NSError *error;
+    AVAudioPlayer *player = [[AVAudioPlayer alloc] initWithContentsOfURL:fileURL error:&error];
+    if (error) {
+        HLog(@"Error: %@", error.localizedDescription);
+        return 0;
+    }
+    return player.duration;
 }
 
 #pragma mark 点击了录音
 - (void)didClickRecordFun
 {
+    if(_recordingV){
+        return;
+    }
+    
+    //检测麦克风权限
+    AVAudioSessionRecordPermission permissionStatus = [[AVAudioSession sharedInstance] recordPermission];
+        
+//    MicrophonePermissionStatus status;
+//    switch (permissionStatus) {
+//        case AVAudioSessionRecordPermissionUndetermined:
+//            status = MicrophonePermissionStatusNotDetermined;
+//            break;
+//        case AVAudioSessionRecordPermissionDenied:
+//            status = MicrophonePermissionStatusDenied;
+//            break;
+//        case AVAudioSessionRecordPermissionGranted:
+//            status = MicrophonePermissionStatusGranted;
+//            break;
+//    }
+    
+    if (permissionStatus == AVAudioSessionRecordPermissionDenied) {
+        NSString *tip = NSLocalizedString(@"mine_record_microphone_tip",nil);
+        [[iToast makeText:tip] show];
+        return;
+    }
+    else if(permissionStatus == AVAudioSessionRecordPermissionUndetermined) {
+        KWeakSelf
+        [[AVAudioSession sharedInstance] requestRecordPermission:^(BOOL granted) {
+                dispatch_async(dispatch_get_main_queue(), ^{
+                    if (granted) {
+                        [weakSelf beginRecordFun];
+                    } else {
+                    }
+                });
+            }];
+        return;
+    }
     
+    
+    [self beginRecordFun];
+    
+}
+
+#pragma mark 弹起录音功能
+- (void)beginRecordFun
+{
+    _recordingV = [[recordingView alloc] init];
+    [ksharedAppDelegate.window addSubview:_recordingV];
+    
+    [_recordingV mas_makeConstraints:^(MASConstraintMaker *make) {
+        make.left.mas_equalTo(0.f);
+        make.right.mas_equalTo(0.f);
+        make.bottom.mas_equalTo(0.f);
+        make.top.mas_equalTo(0);
+    }];
+    
+    [_recordingV beginRecordFun];
+    
+    KWeakSelf
+    _recordingV.didClickRecordEndFun = ^{
+        [weakSelf deleteRecordingViewFun];
+    };
+}
+
+#pragma mark 删除录音中界面
+- (void)deleteRecordingViewFun
+{
+    [_recordingV removeFromSuperview];
+    _recordingV = nil;
 }
 
 @end

+ 17 - 0
创维盒子/code/mine/view/recordFileCell.h

@@ -0,0 +1,17 @@
+//
+//  recordFileCell.h
+//  双子星云手机
+//
+//  Created by xd h on 2025/3/31.
+//
+
+#import <UIKit/UIKit.h>
+#import "recordFileModel.h"
+
+NS_ASSUME_NONNULL_BEGIN
+
+@interface recordFileCell : UITableViewCell
+@property(nonatomic,strong) recordFileModel *curRecordFileModel;
+@end
+
+NS_ASSUME_NONNULL_END

+ 286 - 0
创维盒子/code/mine/view/recordFileCell.m

@@ -0,0 +1,286 @@
+//
+//  recordFileCell.m
+//  双子星云手机
+//
+//  Created by xd h on 2025/3/31.
+//
+
+#import "recordFileCell.h"
+
+@interface recordFileCell ()
+@property(nonatomic,strong)UIView *cellBgView;
+@property(nonatomic,strong)UILabel *nameLabel;//名称
+@property(nonatomic,strong)UILabel *dataLabel;//日期
+@property(nonatomic,strong)UILabel *timeAndSizeLabel;//时长和大小
+
+@property(nonatomic,strong)UIView *cellBg2View;//
+@property(nonatomic,strong)UIView *progressBgView;//进度被拒
+@property(nonatomic,strong)UIView *progressingView;//进度条
+@property(nonatomic,strong)UIView *progressYuanView;//进度小圆点
+
+@property(nonatomic,strong)UILabel *progressingLabel;//已经播放的时长
+@property(nonatomic,strong)UILabel *totaltimeLabel;//总时间
+
+@property(nonatomic,strong)UIButton *editButton;//编辑
+@property(nonatomic,strong)UIButton *deleteButton;//删除
+
+@property(nonatomic,strong)UIButton *backwardButton;//后退
+@property(nonatomic,strong)UIButton *playOrPauseButton;//播放或暂停
+@property(nonatomic,strong)UIButton *forwardButton;//前进
+@end
+
+@implementation recordFileCell
+@synthesize cellBgView;
+
+- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier
+{
+    self = [super initWithStyle:style reuseIdentifier:reuseIdentifier];
+    
+    if (self)
+    {
+        [self drawView];
+    }
+    
+    return self;
+}
+
+- (void)drawView
+{
+    cellBgView = [[UIView alloc] init];
+    cellBgView.layer.cornerRadius = 12;
+    cellBgView.layer.masksToBounds = YES;
+    [self.contentView addSubview:cellBgView];
+    cellBgView.backgroundColor = [UIColor whiteColor];
+    [cellBgView mas_makeConstraints:^(MASConstraintMaker *make) {
+        make.left.mas_equalTo(15.f);
+        make.top.mas_equalTo(0);
+        make.bottom.mas_equalTo(0);
+        make.width.mas_equalTo(SCREEN_W - 2*15.f);
+    }];
+    
+    /**标题*/
+    _nameLabel = [[UILabel alloc] init];
+    [cellBgView addSubview:_nameLabel];
+    _nameLabel.font = [UIFont boldSystemFontOfSize:16.f];
+    //_nameLabel.numberOfLines = 3;
+    [_nameLabel setTextColor:HW0A132BColor];
+    [_nameLabel mas_makeConstraints:^(MASConstraintMaker *make) {
+        make.left.mas_equalTo(12.0);
+        make.top.mas_equalTo(10.0);
+        make.height.mas_equalTo(20.0);
+        //make.top.mas_equalTo(15.f);
+    }];
+    
+    //日期
+    _dataLabel = [[UILabel alloc] init];
+    [cellBgView addSubview:_dataLabel];
+    _dataLabel.font = [UIFont systemFontOfSize:12.f];
+    [_dataLabel setTextColor:[UIColor hwColor:@"979797"]];
+    [_dataLabel mas_makeConstraints:^(MASConstraintMaker *make) {
+        make.left.mas_equalTo(12.0);
+        make.top.equalTo(_nameLabel.mas_bottom).offset(5);
+        make.height.mas_equalTo(20.0);
+        //make.top.mas_equalTo(15.f);
+    }];
+    
+    //时长和大小
+    _timeAndSizeLabel = [[UILabel alloc] init];
+    [cellBgView addSubview:_timeAndSizeLabel];
+    _timeAndSizeLabel.font = [UIFont systemFontOfSize:12.f];
+    _timeAndSizeLabel.textAlignment = NSTextAlignmentRight;
+    [_timeAndSizeLabel setTextColor:[UIColor hwColor:@"979797"]];
+    [_timeAndSizeLabel mas_makeConstraints:^(MASConstraintMaker *make) {
+        make.right.mas_equalTo(-12.0);
+        make.top.equalTo(_nameLabel.mas_bottom).offset(5);
+        make.height.mas_equalTo(20.0);
+        //make.top.mas_equalTo(15.f);
+    }];
+    
+    /********************************************************************************************/
+    //第二部分
+    _cellBg2View = [[UIView alloc] init];
+    [cellBgView addSubview:_cellBg2View];
+    //_cellBg2View.backgroundColor = [UIColor greenColor];
+    [_cellBg2View mas_makeConstraints:^(MASConstraintMaker *make) {
+        make.left.mas_equalTo(0.f);
+        make.right.mas_equalTo(0);
+        make.bottom.mas_equalTo(0);
+        make.height.mas_equalTo(85.f);
+    }];
+    
+    _progressBgView = [[UIView alloc] init];
+    [_cellBg2View addSubview:_progressBgView];
+    _progressBgView.layer.cornerRadius =1.0;
+    _progressBgView.layer.masksToBounds = YES;
+    _progressBgView.backgroundColor = [UIColor hwColor:@"#EEEEEE"];
+    [_progressBgView mas_makeConstraints:^(MASConstraintMaker *make) {
+        make.left.mas_equalTo(12.f);
+        make.right.mas_equalTo(-12);
+        make.top.mas_equalTo(5);
+        make.height.mas_equalTo(2.f);
+    }];
+    
+    _progressingView = [[UIView alloc] init];
+    [_progressBgView addSubview:_progressingView];
+    _progressingView.layer.cornerRadius =1.0;
+    _progressingView.layer.masksToBounds = YES;
+    _progressingView.backgroundColor = [UIColor hwColor:@"#333333"];
+    [_progressingView mas_makeConstraints:^(MASConstraintMaker *make) {
+        make.left.mas_equalTo(0.f);
+        make.right.mas_equalTo(0);
+        make.top.mas_equalTo(0);
+        make.height.mas_equalTo(2.f);
+    }];
+    
+    //
+    _progressYuanView = [[UIView alloc] init];
+    [_cellBg2View addSubview:_progressYuanView];
+    _progressYuanView.layer.cornerRadius = 3.0;
+    _progressYuanView.layer.masksToBounds = YES;
+    _progressYuanView.backgroundColor = [UIColor hwColor:@"#333333"];
+    [_progressYuanView mas_makeConstraints:^(MASConstraintMaker *make) {
+        make.left.mas_equalTo(20.f);
+        make.centerY.equalTo(_progressingView.mas_centerY);
+        make.width.mas_equalTo(6.f);
+        make.height.mas_equalTo(6.f);
+    }];
+    
+    //已经播放的时长
+    _progressingLabel = [[UILabel alloc] init];
+    [_cellBg2View addSubview:_progressingLabel];
+    _progressingLabel.font = [UIFont systemFontOfSize:12.f];
+    [_progressingLabel setTextColor:[UIColor hwColor:@"979797"]];
+    [_progressingLabel mas_makeConstraints:^(MASConstraintMaker *make) {
+        make.left.mas_equalTo(12.0);
+        make.top.equalTo(_progressYuanView.mas_bottom).offset(5);
+        make.height.mas_equalTo(15.0);
+    }];
+    
+    //已经播放的时长
+    _totaltimeLabel = [[UILabel alloc] init];
+    [_cellBg2View addSubview:_totaltimeLabel];
+    _totaltimeLabel.font = [UIFont systemFontOfSize:12.f];
+    _totaltimeLabel.textAlignment = NSTextAlignmentRight;
+    [_totaltimeLabel setTextColor:[UIColor hwColor:@"979797"]];
+    [_totaltimeLabel mas_makeConstraints:^(MASConstraintMaker *make) {
+        make.right.mas_equalTo(-12.0);
+        make.top.equalTo(_progressYuanView.mas_bottom).offset(5);
+        make.height.mas_equalTo(15.0);
+    }];
+    
+    //编辑
+    _editButton = [[UIButton alloc] init];
+    [_editButton setImage:[UIImage imageNamed:@"record_edit_icon"] forState:UIControlStateNormal];
+    [_cellBg2View addSubview:_editButton];
+    
+    [_editButton mas_makeConstraints:^(MASConstraintMaker *make) {
+        make.left.mas_equalTo(12.0);
+        make.bottom.mas_equalTo(-10.0);
+        make.height.mas_equalTo(24.0);
+        make.width.mas_equalTo(24.0);
+    }];
+    
+    //删除
+    _deleteButton = [[UIButton alloc] init];
+    [_deleteButton setImage:[UIImage imageNamed:@"record_delete_icon"] forState:UIControlStateNormal];
+    [_cellBg2View addSubview:_deleteButton];
+    
+    [_deleteButton mas_makeConstraints:^(MASConstraintMaker *make) {
+        make.right.mas_equalTo(-12.0);
+        make.bottom.mas_equalTo(-10.0);
+        make.height.mas_equalTo(24.0);
+        make.width.mas_equalTo(24.0);
+    }];
+    
+    //播放或暂停
+    _playOrPauseButton = [[UIButton alloc] init];
+    [_playOrPauseButton setImage:[UIImage imageNamed:@"record_player_icon"] forState:UIControlStateNormal];
+    [_playOrPauseButton setImage:[UIImage imageNamed:@"record_pause_icon"] forState:UIControlStateSelected];
+    [_cellBg2View addSubview:_playOrPauseButton];
+    
+    [_playOrPauseButton mas_makeConstraints:^(MASConstraintMaker *make) {
+        make.centerX.mas_equalTo(0.0);
+        make.centerY.equalTo(_editButton.mas_centerY).offset(0);
+        make.height.mas_equalTo(24.0);
+        make.width.mas_equalTo(24.0);
+    }];
+    
+    //后退
+    _backwardButton = [[UIButton alloc] init];
+    [_backwardButton setImage:[UIImage imageNamed:@"record_backward_icon"] forState:UIControlStateNormal];
+    [_cellBg2View addSubview:_backwardButton];
+    
+    [_backwardButton mas_makeConstraints:^(MASConstraintMaker *make) {
+        make.right.equalTo(_playOrPauseButton.mas_left).offset(-32);
+        make.centerY.equalTo(_editButton.mas_centerY).offset(0);
+        make.height.mas_equalTo(20.0);
+        make.width.mas_equalTo(20.0);
+    }];
+    
+    //前进
+    _forwardButton = [[UIButton alloc] init];
+    [_forwardButton setImage:[UIImage imageNamed:@"record_forward_icon"] forState:UIControlStateNormal];
+    [_cellBg2View addSubview:_forwardButton];
+    
+    [_forwardButton mas_makeConstraints:^(MASConstraintMaker *make) {
+        make.left.equalTo(_playOrPauseButton.mas_right).offset(32);
+        make.centerY.equalTo(_editButton.mas_centerY).offset(0);
+        make.height.mas_equalTo(20.0);
+        make.width.mas_equalTo(20.0);
+    }];
+}
+
+
+- (void)setCurRecordFileModel:(recordFileModel *)curRecordFileModel
+{
+    _curRecordFileModel = curRecordFileModel;
+    
+    if(_curRecordFileModel.showAllType){
+        _cellBg2View.hidden = NO;
+    }
+    else{
+        _cellBg2View.hidden = YES;
+    }
+    
+    _nameLabel.text = _curRecordFileModel.fileName;
+    
+    // 创建日期格式化器
+    NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
+    // 设置日期格式
+    [dateFormatter setDateFormat:@"yyyy-MM-dd HH:mm:ss"];
+
+    // 将NSDate转换为NSString
+    NSString *dateString = [dateFormatter stringFromDate:_curRecordFileModel.modificationDate];
+    _dataLabel.text =  dateString;
+    
+    //大小
+    NSString * totalSizeStr = nil;
+    NSInteger totalSize_k = _curRecordFileModel.fileSize / 1024;
+    if(totalSize_k < 1024){
+        totalSizeStr = [[NSString alloc] initWithFormat:@"%ldKB",totalSize_k];
+    }
+    else if( totalSize_k >= 1024 && totalSize_k < 1024*1024){
+        totalSizeStr = [[NSString alloc] initWithFormat:@"%.2fMB",totalSize_k/1024.0];
+        
+    }
+    else{
+        totalSizeStr = [[NSString alloc] initWithFormat:@"%.2fG",totalSize_k/1024.0/1024.0];
+    }
+    
+    // 时长 totalTime
+    NSInteger hour = 0;
+    NSInteger min = 0;
+    NSInteger second = 0;
+    
+    hour = _curRecordFileModel.totalTime / 60 /60;
+    min = (_curRecordFileModel.totalTime  -60*hour)/60;
+    second = _curRecordFileModel.totalTime  -60*hour - 60 *min;
+    
+    NSString* totalTimeStr = [[NSString alloc] initWithFormat:@"%02ld:%02ld:%02ld",hour,min,second];;
+    
+    _timeAndSizeLabel.text = [[NSString alloc] initWithFormat:@"%@ %@",totalTimeStr,totalSizeStr];
+    
+    _progressingLabel.text  = @"00:00:00";
+    _totaltimeLabel.text = totalTimeStr;
+}
+@end

+ 18 - 0
创维盒子/code/mine/view/recordingView.h

@@ -0,0 +1,18 @@
+//
+//  recordingView.h
+//  双子星云手机
+//
+//  Created by xd h on 2025/3/28.
+//
+
+#import <UIKit/UIKit.h>
+
+NS_ASSUME_NONNULL_BEGIN
+
+@interface recordingView : UIView
+@property (nonatomic,copy) void (^didClickRecordEndFun)(void);
+
+- (void)beginRecordFun;
+@end
+
+NS_ASSUME_NONNULL_END

+ 86 - 0
创维盒子/code/mine/view/recordingView.m

@@ -0,0 +1,86 @@
+//
+//  recordingView.m
+//  双子星云手机
+//
+//  Created by xd h on 2025/3/28.
+//
+
+#import "recordingView.h"
+#import "AudioRecorderManager.h"
+
+@implementation recordingView
+
+- (id)initWithFrame:(CGRect)frame{
+    self = [super initWithFrame:frame];
+    
+    self.backgroundColor = [UIColor hwColor:@"000000" alpha:0.6];
+    [self drawAnyView];
+    
+    return self;
+}
+
+-(void)drawAnyView{
+    
+    UIView *whiteBgView = [[UIView alloc] init];
+    whiteBgView.backgroundColor = [UIColor whiteColor];
+    [self addSubview:whiteBgView];
+    
+    [whiteBgView mas_makeConstraints:^(MASConstraintMaker *make) {
+        make.left.mas_equalTo(0.f);
+        make.height.mas_equalTo(238.f + AdaptTabHeight);
+        make.right.mas_equalTo(0.f);
+        make.bottom.mas_equalTo(0.f);
+    }];
+    
+
+    /*上圆角*/
+    UIBezierPath *maskPath = [UIBezierPath bezierPathWithRoundedRect:CGRectMake(0, 0, SCREEN_W, 238.f + AdaptTabHeight)
+                                                   byRoundingCorners:UIRectCornerTopLeft|UIRectCornerTopRight
+                                                         cornerRadii:CGSizeMake(12, 12)];
+    CAShapeLayer *maskLayer = [[CAShapeLayer alloc] init];
+    maskLayer.frame = CGRectMake(0, 0, SCREEN_W, 238.f + AdaptTabHeight);
+    maskLayer.path = maskPath.CGPath;
+    whiteBgView.layer.mask = maskLayer;
+
+    UIButton *recordBut = [[UIButton alloc] init];
+    [recordBut setBackgroundImage:[UIImage imageNamed:@"white_record_end_icon"] forState:UIControlStateNormal];
+    [recordBut addTarget:self action:@selector(didClickButFun) forControlEvents:UIControlEventTouchUpInside];
+    [whiteBgView addSubview:recordBut];
+    
+    [recordBut mas_makeConstraints:^(MASConstraintMaker *make) {
+        make.width.mas_equalTo(78.f);
+        make.height.mas_equalTo(78.f);
+        make.centerX.mas_equalTo(0.f);
+        make.bottom.mas_equalTo(-12.f - AdaptTabHeight);
+    }];
+    
+    //
+    UIImageView *recordingTipImageView = [[UIImageView alloc] init];
+    recordingTipImageView.image = [UIImage imageNamed:@"recording_tip"];
+    [whiteBgView addSubview:recordingTipImageView];
+    
+    [recordingTipImageView mas_makeConstraints:^(MASConstraintMaker *make) {
+        make.width.mas_equalTo(323.f*AUTOSCALE);
+        make.height.mas_equalTo(52.f*AUTOSCALE);
+        make.centerX.mas_equalTo(0.f);
+        make.bottom.equalTo(recordBut.mas_top).offset(-20);
+    }];
+    
+    
+}
+
+#pragma mark 开始录音
+- (void)beginRecordFun
+{
+    [[AudioRecorderManager sharedManager] startRecording];
+}
+
+- (void)didClickButFun
+{
+    [[AudioRecorderManager sharedManager] stopRecording];
+    if (_didClickRecordEndFun) {
+        _didClickRecordEndFun();
+    }
+}
+
+@end

+ 1 - 0
创维盒子/code/zh-Hans.lproj/Localizable.strings

@@ -673,3 +673,4 @@
 
 //1.4.4 (1.4.5) 1.10
 "mine_record_title"   = "录音机";
+"mine_record_microphone_tip"   = "麦克风权限被禁用,请到手机的设置页最后的APP菜单找到APP,打开并开启麦克风权限";

+ 66 - 2
创维盒子/双子星云手机.xcodeproj/project.pbxproj

@@ -237,6 +237,10 @@
 		6B257EA02C95964E00CBB70A /* backupPathListModel.m in Sources */ = {isa = PBXBuildFile; fileRef = 6B257E9E2C95964E00CBB70A /* backupPathListModel.m */; };
 		6B257EA12C95964E00CBB70A /* backupPathListModel.h in Headers */ = {isa = PBXBuildFile; fileRef = 6B257E9D2C95964E00CBB70A /* backupPathListModel.h */; };
 		6B257EA22C95964E00CBB70A /* backupPathListModel.m in Sources */ = {isa = PBXBuildFile; fileRef = 6B257E9E2C95964E00CBB70A /* backupPathListModel.m */; };
+		6B2A3BD12D9A6E000058A551 /* recordFileCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 6B2A3BD02D9A6E000058A551 /* recordFileCell.m */; };
+		6B2A3BD22D9A6E000058A551 /* recordFileCell.h in Headers */ = {isa = PBXBuildFile; fileRef = 6B2A3BCF2D9A6E000058A551 /* recordFileCell.h */; };
+		6B2A3BD32D9A6E000058A551 /* recordFileCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 6B2A3BD02D9A6E000058A551 /* recordFileCell.m */; };
+		6B2A3BD42D9A6E000058A551 /* recordFileCell.h in Headers */ = {isa = PBXBuildFile; fileRef = 6B2A3BCF2D9A6E000058A551 /* recordFileCell.h */; };
 		6B2C1E1C2C070ADE00FDCF82 /* ZFAVPlayerManager.h in Headers */ = {isa = PBXBuildFile; fileRef = 6B2C1DCC2C070ADE00FDCF82 /* ZFAVPlayerManager.h */; };
 		6B2C1E1D2C070ADE00FDCF82 /* ZFAVPlayerManager.h in Headers */ = {isa = PBXBuildFile; fileRef = 6B2C1DCC2C070ADE00FDCF82 /* ZFAVPlayerManager.h */; };
 		6B2C1E1E2C070ADE00FDCF82 /* ZFAVPlayerManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 6B2C1DCD2C070ADE00FDCF82 /* ZFAVPlayerManager.m */; };
@@ -550,6 +554,18 @@
 		6B51CE7D2D96715500301429 /* recordBottomView.m in Sources */ = {isa = PBXBuildFile; fileRef = 6B51CE7B2D96715500301429 /* recordBottomView.m */; };
 		6B51CE7E2D96715500301429 /* recordBottomView.m in Sources */ = {isa = PBXBuildFile; fileRef = 6B51CE7B2D96715500301429 /* recordBottomView.m */; };
 		6B51CE7F2D96715500301429 /* recordBottomView.h in Headers */ = {isa = PBXBuildFile; fileRef = 6B51CE7A2D96715500301429 /* recordBottomView.h */; };
+		6B51CE822D96826800301429 /* recordingView.m in Sources */ = {isa = PBXBuildFile; fileRef = 6B51CE812D96826800301429 /* recordingView.m */; };
+		6B51CE832D96826800301429 /* recordingView.h in Headers */ = {isa = PBXBuildFile; fileRef = 6B51CE802D96826800301429 /* recordingView.h */; };
+		6B51CE842D96826800301429 /* recordingView.h in Headers */ = {isa = PBXBuildFile; fileRef = 6B51CE802D96826800301429 /* recordingView.h */; };
+		6B51CE852D96826800301429 /* recordingView.m in Sources */ = {isa = PBXBuildFile; fileRef = 6B51CE812D96826800301429 /* recordingView.m */; };
+		6B51CE892D96972B00301429 /* AudioRecorderManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 6B51CE882D96972B00301429 /* AudioRecorderManager.m */; };
+		6B51CE8A2D96972B00301429 /* AudioRecorderManager.h in Headers */ = {isa = PBXBuildFile; fileRef = 6B51CE872D96972B00301429 /* AudioRecorderManager.h */; };
+		6B51CE8B2D96972B00301429 /* AudioRecorderManager.h in Headers */ = {isa = PBXBuildFile; fileRef = 6B51CE872D96972B00301429 /* AudioRecorderManager.h */; };
+		6B51CE8C2D96972B00301429 /* AudioRecorderManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 6B51CE882D96972B00301429 /* AudioRecorderManager.m */; };
+		6B51CE902D96A68400301429 /* recordFileModel.m in Sources */ = {isa = PBXBuildFile; fileRef = 6B51CE8F2D96A68400301429 /* recordFileModel.m */; };
+		6B51CE912D96A68400301429 /* recordFileModel.h in Headers */ = {isa = PBXBuildFile; fileRef = 6B51CE8E2D96A68400301429 /* recordFileModel.h */; };
+		6B51CE922D96A68400301429 /* recordFileModel.h in Headers */ = {isa = PBXBuildFile; fileRef = 6B51CE8E2D96A68400301429 /* recordFileModel.h */; };
+		6B51CE932D96A68400301429 /* recordFileModel.m in Sources */ = {isa = PBXBuildFile; fileRef = 6B51CE8F2D96A68400301429 /* recordFileModel.m */; };
 		6B53949F2C81A99200195AA4 /* nasMixBackupsManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 6B53949E2C81A99200195AA4 /* nasMixBackupsManager.m */; };
 		6B5394A02C81A99200195AA4 /* nasMixBackupsManager.h in Headers */ = {isa = PBXBuildFile; fileRef = 6B53949D2C81A99200195AA4 /* nasMixBackupsManager.h */; };
 		6B5394A12C81A99200195AA4 /* nasMixBackupsManager.h in Headers */ = {isa = PBXBuildFile; fileRef = 6B53949D2C81A99200195AA4 /* nasMixBackupsManager.h */; };
@@ -1668,6 +1684,8 @@
 		6B238C932C60AF6A00C5AC2F /* nasDownloadFileManager.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = nasDownloadFileManager.m; sourceTree = "<group>"; };
 		6B257E9D2C95964E00CBB70A /* backupPathListModel.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = backupPathListModel.h; sourceTree = "<group>"; };
 		6B257E9E2C95964E00CBB70A /* backupPathListModel.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = backupPathListModel.m; sourceTree = "<group>"; };
+		6B2A3BCF2D9A6E000058A551 /* recordFileCell.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = recordFileCell.h; sourceTree = "<group>"; };
+		6B2A3BD02D9A6E000058A551 /* recordFileCell.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = recordFileCell.m; sourceTree = "<group>"; };
 		6B2C1DCC2C070ADE00FDCF82 /* ZFAVPlayerManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ZFAVPlayerManager.h; sourceTree = "<group>"; };
 		6B2C1DCD2C070ADE00FDCF82 /* ZFAVPlayerManager.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ZFAVPlayerManager.m; sourceTree = "<group>"; };
 		6B2C1DCF2C070ADE00FDCF82 /* UIImageView+ZFCache.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "UIImageView+ZFCache.h"; sourceTree = "<group>"; };
@@ -1834,6 +1852,12 @@
 		6B51CE752D964D1900301429 /* recordViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = recordViewController.m; sourceTree = "<group>"; };
 		6B51CE7A2D96715500301429 /* recordBottomView.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = recordBottomView.h; sourceTree = "<group>"; };
 		6B51CE7B2D96715500301429 /* recordBottomView.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = recordBottomView.m; sourceTree = "<group>"; };
+		6B51CE802D96826800301429 /* recordingView.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = recordingView.h; sourceTree = "<group>"; };
+		6B51CE812D96826800301429 /* recordingView.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = recordingView.m; sourceTree = "<group>"; };
+		6B51CE872D96972B00301429 /* AudioRecorderManager.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AudioRecorderManager.h; sourceTree = "<group>"; };
+		6B51CE882D96972B00301429 /* AudioRecorderManager.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = AudioRecorderManager.m; sourceTree = "<group>"; };
+		6B51CE8E2D96A68400301429 /* recordFileModel.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = recordFileModel.h; sourceTree = "<group>"; };
+		6B51CE8F2D96A68400301429 /* recordFileModel.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = recordFileModel.m; sourceTree = "<group>"; };
 		6B53949D2C81A99200195AA4 /* nasMixBackupsManager.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = nasMixBackupsManager.h; sourceTree = "<group>"; };
 		6B53949E2C81A99200195AA4 /* nasMixBackupsManager.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = nasMixBackupsManager.m; sourceTree = "<group>"; };
 		6B5B605E2B3BC8DE009A2AE2 /* fileTransferPopView.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = fileTransferPopView.h; sourceTree = "<group>"; };
@@ -3126,6 +3150,24 @@
 			path = DFPlayer;
 			sourceTree = "<group>";
 		};
+		6B51CE862D96970F00301429 /* AudioRecorderManager */ = {
+			isa = PBXGroup;
+			children = (
+				6B51CE872D96972B00301429 /* AudioRecorderManager.h */,
+				6B51CE882D96972B00301429 /* AudioRecorderManager.m */,
+			);
+			path = AudioRecorderManager;
+			sourceTree = "<group>";
+		};
+		6B51CE8D2D96A5D200301429 /* model */ = {
+			isa = PBXGroup;
+			children = (
+				6B51CE8E2D96A68400301429 /* recordFileModel.h */,
+				6B51CE8F2D96A68400301429 /* recordFileModel.m */,
+			);
+			path = model;
+			sourceTree = "<group>";
+		};
 		6B5B60622B3D5F72009A2AE2 /* fileTransfeSet */ = {
 			isa = PBXGroup;
 			children = (
@@ -3259,6 +3301,8 @@
 		6B679DF42C25593800D0DC03 /* mine */ = {
 			isa = PBXGroup;
 			children = (
+				6B51CE8D2D96A5D200301429 /* model */,
+				6B51CE862D96970F00301429 /* AudioRecorderManager */,
 				6B679DFB2C255D9900D0DC03 /* view */,
 				6B679DF52C25595700D0DC03 /* mineViewController.h */,
 				6B679DF62C25595700D0DC03 /* mineViewController.m */,
@@ -3283,6 +3327,10 @@
 				6B679DFD2C255DC900D0DC03 /* MineCommonUsedView.m */,
 				6B51CE7A2D96715500301429 /* recordBottomView.h */,
 				6B51CE7B2D96715500301429 /* recordBottomView.m */,
+				6B51CE802D96826800301429 /* recordingView.h */,
+				6B51CE812D96826800301429 /* recordingView.m */,
+				6B2A3BCF2D9A6E000058A551 /* recordFileCell.h */,
+				6B2A3BD02D9A6E000058A551 /* recordFileCell.m */,
 			);
 			path = view;
 			sourceTree = "<group>";
@@ -3969,6 +4017,7 @@
 				6B8A5AE02C3BCC0E00E40B19 /* lastFileModel.h in Headers */,
 				6B5B60762B3E665E009A2AE2 /* filePathCreatPopView.h in Headers */,
 				18BA24872AA5C57900BA01EE /* RSATool.h in Headers */,
+				6B51CE912D96A68400301429 /* recordFileModel.h in Headers */,
 				6B5D40232B4AA7BF000965CF /* downLoadPreviewViewController.h in Headers */,
 				6B2C1E7C2C070ADE00FDCF82 /* ZFOrientationObserver.h in Headers */,
 				6B2C1E842C070ADE00FDCF82 /* ZFPlayer.h in Headers */,
@@ -3993,6 +4042,7 @@
 				6B4C0F722C0314BA0070EF2E /* DFPlayerTool.h in Headers */,
 				6B679DEA2C252A4E00D0DC03 /* NASMySpaceViewController.h in Headers */,
 				6B4C0F622C0314BA0070EF2E /* DFPlayerFileManager.h in Headers */,
+				6B2A3BD22D9A6E000058A551 /* recordFileCell.h in Headers */,
 				6BB5730F2C7C18DC00713351 /* frpFileExistModel.h in Headers */,
 				6B2170982B15CD9200656670 /* NSDictionary+Log.h in Headers */,
 				6B7E042C2C3E5A98004B4948 /* customDownloadManager.h in Headers */,
@@ -4016,6 +4066,7 @@
 				6B2C1E982C070ADE00FDCF82 /* ZFPlayerNotification.h in Headers */,
 				6B5394A02C81A99200195AA4 /* nasMixBackupsManager.h in Headers */,
 				6B7EA7A42BF607FB002D5CC2 /* imageDetailsScrollViewController.h in Headers */,
+				6B51CE842D96826800301429 /* recordingView.h in Headers */,
 				6BFF26952AF9D8CC00FCB4F7 /* AuthCodeInputView.h in Headers */,
 				6B1CC2C62B677F3E00AD4217 /* extraMediaEventModel.h in Headers */,
 				6B42C1572C2A6C2700936268 /* SYJUISwitch.h in Headers */,
@@ -4103,6 +4154,7 @@
 				18EC79DC2ABC109F0084836A /* SetPWDSecondViewController.h in Headers */,
 				6B4C0F662C0314BA0070EF2E /* DFPlayerLyricsTableview.h in Headers */,
 				6B1F7FCA2C0064B500954720 /* boxReceiveFileRecordCell.h in Headers */,
+				6B51CE8B2D96972B00301429 /* AudioRecorderManager.h in Headers */,
 				6B0582852B0457C400D37290 /* uploadFileManager.h in Headers */,
 				6B2C1E2C2C070ADE00FDCF82 /* ZFLoadingView.h in Headers */,
 				6B2C1EA42C070ADE00FDCF82 /* ZFPresentTransition.h in Headers */,
@@ -4254,6 +4306,7 @@
 				6B8A5AE32C3BCC0E00E40B19 /* lastFileModel.h in Headers */,
 				6BD506AD2B9576A4006E7CB0 /* filePathCreatPopView.h in Headers */,
 				6BD506AE2B9576A4006E7CB0 /* RSATool.h in Headers */,
+				6B51CE922D96A68400301429 /* recordFileModel.h in Headers */,
 				6BD506AF2B9576A4006E7CB0 /* downLoadPreviewViewController.h in Headers */,
 				6B2C1E7D2C070ADE00FDCF82 /* ZFOrientationObserver.h in Headers */,
 				6B2C1E852C070ADE00FDCF82 /* ZFPlayer.h in Headers */,
@@ -4278,6 +4331,7 @@
 				6B4C0F732C0314BA0070EF2E /* DFPlayerTool.h in Headers */,
 				6B679DEC2C252A4E00D0DC03 /* NASMySpaceViewController.h in Headers */,
 				6B4C0F632C0314BA0070EF2E /* DFPlayerFileManager.h in Headers */,
+				6B2A3BD42D9A6E000058A551 /* recordFileCell.h in Headers */,
 				6BB573112C7C18DC00713351 /* frpFileExistModel.h in Headers */,
 				6BD506B92B9576A4006E7CB0 /* NSDictionary+Log.h in Headers */,
 				6B7E042D2C3E5A98004B4948 /* customDownloadManager.h in Headers */,
@@ -4301,6 +4355,7 @@
 				6B2C1E992C070ADE00FDCF82 /* ZFPlayerNotification.h in Headers */,
 				6B5394A12C81A99200195AA4 /* nasMixBackupsManager.h in Headers */,
 				6B7EA7A62BF607FB002D5CC2 /* imageDetailsScrollViewController.h in Headers */,
+				6B51CE832D96826800301429 /* recordingView.h in Headers */,
 				6BD506C22B9576A4006E7CB0 /* AuthCodeInputView.h in Headers */,
 				6BD506C32B9576A4006E7CB0 /* extraMediaEventModel.h in Headers */,
 				6B42C1582C2A6C2700936268 /* SYJUISwitch.h in Headers */,
@@ -4388,6 +4443,7 @@
 				6BD506EB2B9576A4006E7CB0 /* SetPWDSecondViewController.h in Headers */,
 				6B4C0F672C0314BA0070EF2E /* DFPlayerLyricsTableview.h in Headers */,
 				6B1F7FCC2C0064B500954720 /* boxReceiveFileRecordCell.h in Headers */,
+				6B51CE8A2D96972B00301429 /* AudioRecorderManager.h in Headers */,
 				6BD506EC2B9576A4006E7CB0 /* uploadFileManager.h in Headers */,
 				6B2C1E2D2C070ADE00FDCF82 /* ZFLoadingView.h in Headers */,
 				6B2C1EA52C070ADE00FDCF82 /* ZFPresentTransition.h in Headers */,
@@ -4825,6 +4881,7 @@
 				6BD5073C2B9576A4006E7CB0 /* HWSetViewController.m in Sources */,
 				6BD5073D2B9576A4006E7CB0 /* JSONValueTransformer.m in Sources */,
 				6BD5073E2B9576A4006E7CB0 /* AFAutoPurgingImageCache.m in Sources */,
+				6B2A3BD32D9A6E000058A551 /* recordFileCell.m in Sources */,
 				6BD5073F2B9576A4006E7CB0 /* AuthCodeInputView.m in Sources */,
 				6B7E04372C3E5A98004B4948 /* NSURLSession+customDownloadTask.m in Sources */,
 				6B3958722C34FA25003FC6C3 /* NasPreviewVideoViewController.m in Sources */,
@@ -4862,6 +4919,7 @@
 				6BD5074E2B9576A4006E7CB0 /* couldPhoneBaseInfoModel.m in Sources */,
 				6BD5074F2B9576A4006E7CB0 /* uploadFileBottomView.m in Sources */,
 				6B257EA22C95964E00CBB70A /* backupPathListModel.m in Sources */,
+				6B51CE822D96826800301429 /* recordingView.m in Sources */,
 				6B97739E2C637C4800213317 /* nasUploadManager.m in Sources */,
 				6BD507502B9576A4006E7CB0 /* LogoSelectView.m in Sources */,
 				6B679DED2C252A4E00D0DC03 /* NASMySpaceViewController.m in Sources */,
@@ -4994,6 +5052,7 @@
 				6BD507992B9576A4006E7CB0 /* couldPhoneCommonModel.m in Sources */,
 				6BD5079A2B9576A4006E7CB0 /* PlayerLoadingView.m in Sources */,
 				6BD5079B2B9576A4006E7CB0 /* FMDatabaseAdditions.m in Sources */,
+				6B51CE892D96972B00301429 /* AudioRecorderManager.m in Sources */,
 				6BD5079C2B9576A4006E7CB0 /* BGDB.m in Sources */,
 				6BD5079D2B9576A4006E7CB0 /* UITextfield+NLLimit.m in Sources */,
 				6B78FD322CD4727E00E1A8B2 /* cloudPhoneModelViewController.m in Sources */,
@@ -5032,6 +5091,7 @@
 				6BD507B12B9576A4006E7CB0 /* photoPreViewBottomView.m in Sources */,
 				6B9037232CC0BD58009795F0 /* nonWifiTipInRecordView.m in Sources */,
 				6BD507B22B9576A4006E7CB0 /* TipsQRCodeViewController.m in Sources */,
+				6B51CE932D96A68400301429 /* recordFileModel.m in Sources */,
 				6BD507B32B9576A4006E7CB0 /* JSONAPI.m in Sources */,
 				6BD507B42B9576A4006E7CB0 /* PlayerControlButTipView.m in Sources */,
 				6BD507B52B9576A4006E7CB0 /* PhoneTimeInfoModel.m in Sources */,
@@ -5192,6 +5252,7 @@
 				A031DD7A27EC713A00909527 /* HWSetViewController.m in Sources */,
 				183AE6022A89CE3C00B11CB0 /* JSONValueTransformer.m in Sources */,
 				183AE6522A8A2CF000B11CB0 /* AFAutoPurgingImageCache.m in Sources */,
+				6B2A3BD12D9A6E000058A551 /* recordFileCell.m in Sources */,
 				6BFF26962AF9D8CC00FCB4F7 /* AuthCodeInputView.m in Sources */,
 				6B7E04362C3E5A98004B4948 /* NSURLSession+customDownloadTask.m in Sources */,
 				6B3958702C34FA25003FC6C3 /* NasPreviewVideoViewController.m in Sources */,
@@ -5229,6 +5290,7 @@
 				6B7272582B0DAF7600C03F87 /* couldPhoneBaseInfoModel.m in Sources */,
 				6B0581B32AFE02B100D37290 /* uploadFileBottomView.m in Sources */,
 				6B257EA02C95964E00CBB70A /* backupPathListModel.m in Sources */,
+				6B51CE852D96826800301429 /* recordingView.m in Sources */,
 				6B97739B2C637C4800213317 /* nasUploadManager.m in Sources */,
 				181E85012A8F6B1800292B96 /* LogoSelectView.m in Sources */,
 				6B679DEB2C252A4E00D0DC03 /* NASMySpaceViewController.m in Sources */,
@@ -5361,6 +5423,7 @@
 				6B5D40162B47F27A000965CF /* couldPhoneCommonModel.m in Sources */,
 				187076782A9F400300F15F7F /* PlayerLoadingView.m in Sources */,
 				A08A950127E9A4E400C544BB /* FMDatabaseAdditions.m in Sources */,
+				6B51CE8C2D96972B00301429 /* AudioRecorderManager.m in Sources */,
 				A08A94FB27E9A4E400C544BB /* BGDB.m in Sources */,
 				A003F6B427D841EE00715CBF /* UITextfield+NLLimit.m in Sources */,
 				6B78FD302CD4727E00E1A8B2 /* cloudPhoneModelViewController.m in Sources */,
@@ -5399,6 +5462,7 @@
 				6B0582702AFF692700D37290 /* photoPreViewBottomView.m in Sources */,
 				6B9037202CC0BD58009795F0 /* nonWifiTipInRecordView.m in Sources */,
 				1868201E2AB97BE1005702A6 /* TipsQRCodeViewController.m in Sources */,
+				6B51CE902D96A68400301429 /* recordFileModel.m in Sources */,
 				183AE6092A89CE3C00B11CB0 /* JSONAPI.m in Sources */,
 				6BF52CAE2AD82EA500A617DB /* PlayerControlButTipView.m in Sources */,
 				1810F9002AA1839C00322116 /* PhoneTimeInfoModel.m in Sources */,
@@ -5892,7 +5956,7 @@
 				INFOPLIST_FILE = code/Info.plist;
 				INFOPLIST_KEY_CFBundleDisplayName = "Private-X";
 				INFOPLIST_KEY_NSCameraUsageDescription = "Private-X需求获取您的相机扫码登录。";
-				INFOPLIST_KEY_NSMicrophoneUsageDescription = "Private-X需求获取您的麦克风进行录音文件。";
+				INFOPLIST_KEY_NSMicrophoneUsageDescription = "Private-X需求获取您的麦克风在录音机功能中进行录音操作。";
 				INFOPLIST_KEY_NSPhotoLibraryAddUsageDescription = "Private-X需求使用您的相册保存图片。";
 				INFOPLIST_KEY_NSPhotoLibraryUsageDescription = "Private-X需求获取您的相册图片。";
 				INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES;
@@ -5969,7 +6033,7 @@
 				INFOPLIST_FILE = code/Info.plist;
 				INFOPLIST_KEY_CFBundleDisplayName = "Private-X";
 				INFOPLIST_KEY_NSCameraUsageDescription = "Private-X需求获取您的相机扫码登录。";
-				INFOPLIST_KEY_NSMicrophoneUsageDescription = "Private-X需求获取您的麦克风进行录音文件。";
+				INFOPLIST_KEY_NSMicrophoneUsageDescription = "Private-X需求获取您的麦克风在录音机功能中进行录音操作。";
 				INFOPLIST_KEY_NSPhotoLibraryAddUsageDescription = "Private-X需求使用您的相册保存图片。";
 				INFOPLIST_KEY_NSPhotoLibraryUsageDescription = "Private-X需求获取您的相册图片。";
 				INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES;