objective c - ¿Cómo solicito permiso de grabación de micrófono del usuario?
objective-c ios7 (5)
Estoy utilizando el nuevo SDK para desarrolladores de iOS7 y ahora la aplicación le solicita al usuario su permiso para grabar desde el micrófono cuando la aplicación intenta grabar por primera vez.
Mi aplicación registrará después de una cuenta atrás, por lo que el usuario no puede ver esta solicitud. Yo uso este código para verificar el requestRecordPermission
:
[[AVAudioSession sharedInstance] requestRecordPermission:^(BOOL granted) {
if (granted) {
// Microphone enabled code
}
else {
// Microphone disabled code
}
}];
Pero, ¿cómo puedo activar la solicitud antes de comenzar a grabar?
Aquí está el fragmento de código final que funciona para mí. Es compatible con Xcode 4 y 5, y funciona para iOS5 +.
#ifndef __IPHONE_7_0
typedef void (^PermissionBlock)(BOOL granted);
#endif
PermissionBlock permissionBlock = ^(BOOL granted) {
if (granted)
{
[self doActualRecording];
}
else
{
// Warn no access to microphone
}
};
// iOS7+
if([[AVAudioSession sharedInstance] respondsToSelector:@selector(requestRecordPermission:)])
{
[[AVAudioSession sharedInstance] performSelector:@selector(requestRecordPermission:)
withObject:permissionBlock];
}
else
{
[self doActualRecording];
}
Basado en la respuesta de .
AVAudioSession *session = [AVAudioSession sharedInstance];
// AZ DEBUG @@ iOS 7+
AVAudioSessionRecordPermission sessionRecordPermission = [session recordPermission];
switch (sessionRecordPermission) {
case AVAudioSessionRecordPermissionUndetermined:
NSLog(@"Mic permission indeterminate. Call method for indeterminate stuff.");
break;
case AVAudioSessionRecordPermissionDenied:
NSLog(@"Mic permission denied. Call method for denied stuff.");
break;
case AVAudioSessionRecordPermissionGranted:
NSLog(@"Mic permission granted. Call method for granted stuff.");
break;
default:
break;
}
Como "One Man Crew" afirmó que puede usar requestRecordPermission.
Lo importante a tener en cuenta es que debe verificar que se haya implementado requestRecordPermission. La razón es que si su aplicación se ejecutara en una versión anterior de iOS (por ejemplo, iOS 6.x) se bloquearía después de esta llamada. Para evitarlo, debe verificar que este selector esté implementado (esta es una buena práctica de todos modos).
El código debería ser algo como esto:
if([[AVAudioSession sharedInstance] respondsToSelector:@selector(requestRecordPermission:)]){
[[AVAudioSession sharedInstance] requestRecordPermission];
}
Usando este método, su aplicación admitiría el nuevo sistema operativo y también las versiones anteriores del sistema operativo.
Estoy usando este método cada vez que Apple agrega más funcionalidad al nuevo sistema operativo (de esa forma puedo admitir versiones anteriores con bastante facilidad).
En el nuevo iOS7 es muy sencillo probar esto:
if([[AVAudioSession sharedInstance] respondsToSelector:@selector(requestRecordPermission)])
{
[[AVAudioSession sharedInstance] requestRecordPermission];
}
AVAudioSession.sharedInstance().requestRecordPermission({ (granted) -> Void in
if !granted
{
let microphoneAccessAlert = UIAlertController(title: NSLocalizedString("recording_mic_access",comment:""), message: NSLocalizedString("recording_mic_access_message",comment:""), preferredStyle: UIAlertControllerStyle.Alert)
var okAction = UIAlertAction(title: NSLocalizedString("OK",comment:""), style: UIAlertActionStyle.Default, handler: { (alert: UIAlertAction!) -> Void in
UIApplication.sharedApplication().openURL(NSURL(string: UIApplicationOpenSettingsURLString)!)
})
var cancelAction = UIAlertAction(title: NSLocalizedString("Cancel",comment:""), style: UIAlertActionStyle.Cancel, handler: { (alert: UIAlertAction!) -> Void in
})
microphoneAccessAlert.addAction(okAction)
microphoneAccessAlert.addAction(cancelAction)
self.presentViewController(microphoneAccessAlert, animated: true, completion: nil)
return
}
self.performSegueWithIdentifier("segueNewRecording", sender: nil)
});