AVAudioRecorder не будет записывать на устройстве - PullRequest
6 голосов
/ 20 апреля 2010

Это мой метод:

-(void) playOrRecord:(UIButton *)sender {
    if (playBool == YES) {
        NSError *error = nil;
        NSString *filePath = [[NSBundle mainBundle] pathForResource:[NSString stringWithFormat: @"%d", [sender tag]] ofType:@"caf"];
        NSURL *fileUrl = [NSURL fileURLWithPath:filePath];
        AVAudioPlayer *player = [[AVAudioPlayer alloc] initWithContentsOfURL:fileUrl error:&error];
        [player setNumberOfLoops:0];
        [player play];      
    }
    else if (playBool == NO) {
        if ([recorder isRecording]) {
            [recorder stop];
            [nowRecording setImage:[UIImage imageNamed:@"NormalNormal.png"] forState:UIControlStateNormal];
            [nowRecording setImage:[UIImage imageNamed:@"NormalSelected.png"] forState:UIControlStateSelected];
        }
        if (nowRecording == sender) {
        nowRecording = nil;
        return;
        }
        nowRecording = sender;
        NSError *error = nil;
        NSString *filePath = [[NSBundle mainBundle] pathForResource:[NSString stringWithFormat: @"%d", [sender tag]] ofType:@"caf"];
        NSURL *fileUrl = [NSURL fileURLWithPath:filePath];
        [sender setImage:[UIImage imageNamed:@"RecordingNormal.png"] forState:UIControlStateNormal];
        [sender setImage:[UIImage imageNamed:@"RecordingSelected.png"] forState:UIControlStateSelected];        
        recorder = [[AVAudioRecorder alloc] initWithURL:fileUrl settings:recordSettings error:&error];
        [recorder record];
    }
}

Большая часть этого говорит сама за себя; playBool - это BOOL, который ДА, когда он находится в режиме воспроизведения. Все работает в симуляторе, однако, когда я запускаю его на устройстве, [recordder record] возвращает NO. Кто-нибудь знает, почему это происходит?

Ответы [ 5 ]

17 голосов
/ 29 июня 2012

Если где-то в вашем коде у вас есть эта настройка:

[[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayback error:nil];

Измените его на:

[[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayAndRecord error:nil];

Установка неправильной категории AVAudioSession приведет к сбою записи / воспроизведения.

4 голосов
/ 21 июня 2010

Это потому, что вы не можете изменить пакет приложений на устройстве (оно подписано).Вы можете записать в папку docs своего приложения или в каталог tmp.

3 голосов
/ 22 апреля 2010

Хорошо, решил мой собственный вопрос; Я не знаю почему, но я должен записывать в NSTevenDirectory, когда на устройстве. Изменение, которое полностью исправило это.

1 голос
/ 14 сентября 2016

Кроме того, убедитесь, что вашему приложению разрешен доступ к микрофону (т. Е. В настройках iOS прокрутите вниз и найдите свое приложение, и в нем должно быть «Микрофон», который необходимо переключить на «вкл.»)

1 голос
/ 03 января 2011

У меня была точно такая же проблема. Оказывается, я столкнулся с неправильно сгенерированным оператором пути. AVAudioRecorder инициализировался нормально - и без инцидентов - но iOS просто не позволила бы мне писать в него. Зачем? Проверьте это:

    /* The following code will fail - why? It fails because it is trying to write some path that is NOT accessible by
    this app.
NSString *recordedAudioPath = [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) 
                                objectAtIndex:0] 
                               stringByAppendingString:@"recorded.caf"];
 */
// Correction:
NSString *recordedAudioPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) 
                               objectAtIndex:0];

recordedAudioPath = [recordedAudioPath stringByAppendingPathComponent:@"recorded.caf"];
NSURL *recordURL = [NSURL fileURLWithPath:recordedAudioPath];

Теперь это имеет смысл. Спасибо, что направил меня в правильном направлении.

...