vibracion vibra solucion silencio poner inicio como boton iphone ios events volume

solucion - vibracion iphone 6



¿Cómo implementar un obturador de tecla de volumen para iPhone? (5)

Quiero implementar el mismo comportamiento con la cámara nativa de iOS5 :

  • presione el botón de volumen + para tomar una foto

¿Cuál es la forma ideal de archivarlo? ¿Hay alguna forma de capturar el evento presionada tecla de volumen?

Después de buscar en Google y buscar por horas, encontré 1 solución: usando NSNotificationCenter :

... [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(volumeChanged:) name:@"AVSystemController_SystemVolumeDidChangeNotification" object:nil]; ... - (void)volumeChanged:(NSNotification *)notification{ [self takePhoto]; }

Sin embargo, tiene 2 problemas:

  • Hay una superposición semitransparente de "volumen del sistema actual" que aparece cada vez que presiono la tecla de volumen, esto no es lo que quería.
  • Para la cámara nativa, cuando presione la tecla de volumen como obturador, el volumen del sistema no cambiará; sin embargo, con el método anterior, el volumen del sistema cambiará.

Basándose en el código de huxia, esto funciona en ios5 +, no es necesario ejecutar el código cada vez que se activa, simplemente ejecútelo una vez al principio.

// these 4 lines of code tell the system that "this app needs to play sound/music" AVAudioPlayer* p = [[AVAudioPlayer alloc] initWithContentsOfURL:[NSURL fileURLWithPath:[[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:@"photoshutter.wav"]] error:NULL]; [p prepareToPlay]; [p stop]; //make MPVolumeView Offscreen CGRect frame = CGRectMake(-1000, -1000, 100, 100); MPVolumeView *volumeView = [[MPVolumeView alloc] initWithFrame:frame]; [volumeView sizeToFit]; [self.view addSubview:volumeView];


Actualmente no hay una forma oficial de capturar el evento de tecla presionada de volumen. La línea indicada por Apple es que el botón de volumen funciona con el UIImagePickerController si le UIImagePickerController mostrar los controles de la cámara.

Otros enfoques, como escuchar la notificación, parecen ser pirateos sin respaldo que el equipo de Apple está haciendo, a veces, de forma anecdótica. Para evitar que el HUD de volumen aparezca, puede usar los métodos de aplicación UIApplication no UIApplication :

- (void)setSystemVolumeHUDEnabled:(BOOL)enabled; - (void)setSystemVolumeHUDEnabled:(BOOL)enabled forAudioCategory:(NSString *)category;

La única declaración de su uso que he visto es:

UIApplication *app = [UIApplication sharedApplication]; [app setSystemVolumeHUDEnabled:NO forAudioCategory:@"Ringtone"]; [app setSystemVolumeHUDEnabled:NO];

No estoy seguro de si, o por qué, parece necesitar deshabilitar el HUD para una categoría específica y luego, en general, pero sin la documentación adecuada que sea difícil de descifrar.

Entonces: use UIImagePickerController y sus botones de cámara si quiere estar dentro de las reglas. Si ha encontrado una aplicación que parece funcionar fuera de las reglas, probablemente esté utilizando los métodos anteriores.


He encontrado otra manera de ocultar la "superposición de volumen del sistema" y "omitir el cambio de volumen del sistema cuando presiono la tecla de volumen".

La parte mala: este es un truco súper feo .

Sin embargo, la parte buena es: este hack feo no utiliza API privadas.

Otra nota es: solo funciona para ios5 + (de todos modos, para mi problema, ya que AVSystemController_SystemVolumeDidChangeNotification solo funciona para ios5, por lo que este UGLY hack solo se ajusta a mi problema).

La forma en que funciona: "actúa como una aplicación de reproducción de música / películas y deja que la tecla de volumen ajuste el volumen de la aplicación".

Código:

// these 4 lines of code tell the system that "this app needs to play sound/music" AVAudioPlayer* p = [[AVAudioPlayer alloc] initWithContentsOfURL:[NSURL fileURLWithPath:[[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:@"photo-shutter.wav"]] error:NULL]; [p prepareToPlay]; [p stop]; [p release]; // these 5 lines of code tell the system that "this window has an volume view inside it, so there is no need to show a system overlay" [[self.view viewWithTag:54870149] removeFromSuperview]; MPVolumeView* vv = [[MPVolumeView alloc] initWithFrame:CGRectMake(-100, -100, 100, 100)]; [self.view addSubview:vv]; vv.tag = 54870149; [vv release];

(5 horas gastando en descubrir este método super feo ... mierda ... 草 尼马 啊!)

Otra cosa: si tomas el truco anterior, debes ejecutar el código CADA VEZ cuando tu aplicación se active. Por lo tanto, es posible que deba poner algún código en su delegado de la aplicación.

- (void)applicationDidBecomeActive:(UIApplication *)application


...

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(volumeChanged:) name:@"AVSystemController_SystemVolumeDidChangeNotification" object:nil];

...

- (void)volumeChanged:(NSNotification *)notification{ CGRect frame = CGRectMake(-1000, -1000, 100, 100); MPVolumeView *volumeView = [[MPVolumeView alloc] initWithFrame:frame]; [volumeView sizeToFit]; [self.view addSubview:volumeView]; [volumeView release]; [self takePhoto]; }


Llamo a este método desde viewDidAppear

-(void) startTrackingVolume { [[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryAmbient withOptions:AVAudioSessionCategoryOptionMixWithOthers error:nil]; [[AVAudioSession sharedInstance] setActive:YES error:nil]; if (!self.volumeView) { // put it somewhere outside the bounds of parent view self.volumeView = [[MPVolumeView alloc] initWithFrame:CGRectMake(-100, -100, 10, 0)]; [self.volumeView sizeToFit]; } if (!self.volumeView.superview) { [self.view addSubview:self.volumeView]; } }

En viewWillDisappear en llamada

[[AVAudioSession sharedInstance] setActive:NO error:nil];