2010-04-20 10 views
6

Este es mi método:AVAudioRecorder no grabará en el dispositivo

-(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]; 
    } 
} 

La mayor parte es auto explicativo; playBool es un BOOL que es SÍ cuando está en modo de juego. Todo funciona en el simulador; sin embargo, cuando lo ejecuto en un dispositivo, [registro de la grabadora] devuelve NO. ¿Alguien tiene una pista de por qué está sucediendo esto?

Respuesta

3

Ok, resolví mi propia pregunta; No sé por qué, pero tengo que grabar en NSTemporaryDirectory cuando esté en un dispositivo. Cambiando eso completamente arreglado.

+0

porque no puedes cambiar el paquete de la aplicación !!! lol –

4

Esto se debe a que no puede modificar el conjunto de aplicaciones en el dispositivo (está firmado). Puede grabar en la carpeta docs de su aplicación o en el directorio tmp.

1

Tuve exactamente el mismo problema. Resultó que estaba chocando con una declaración de ruta generada incorrectamente. El AVAudioRecorder se inicializó bien, y sin incidentes, pero iOS simplemente no me permitió escribir en él. ¿Por qué? Échale un vistazo:

/* 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]; 

Esto tiene sentido completo ahora. Gracias por dirigirme en la dirección correcta.

+0

Se ven exactamente lo mismo ... – Gu1234

+0

La diferencia es que el componente de ruta se agrega si es necesario. En esencia, se suma a/antes recorded.caf El código anterior 'incorrectos' hubiera funcionado si se utiliza: NSString * recordedAudioPath = [[NSSearchPathForDirectoriesInDomains (NSDocumentDirectory, NSUserDomainMask, SÍ) objectAtIndex: 0] stringByAppendingString: @ "/ recorded.caf "]; –

17

Si cualquier parte del código que tiene esta configuración:

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

Cambiar a:

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

Ajuste de la categoría AVAudioSession equivocada causará grabación/reproducción falle.

1

También, asegúrese de que esté permitido su aplicación para acceder al micrófono (es decir, en la configuración de iOS, desplazarse hacia abajo y encontrar su aplicación, y debe tener 'micrófono', que tiene que cambiar en 'on')

+0

¿Qué? Este problema he estado tratando de depurar durante dos días no podría ser algo tan simple, por supuesto, este dispositivo tiene permisos de micrófono, ver ... Oh, eso fue todo. Dispositivo/simulador totalmente un arenque rojo. iOS debería al menos registrar un error, no fallar silenciosamente. Gracias, a veces es algo tan básico. –

Cuestiones relacionadas