2012-06-19 14 views
20

La nuestra es una aplicación de atención médica. Contamos con un reconocedor de voz compatible con HIPAA en la aplicación a través del cual todo el dictado puede tener lugar. Los hospitales no quieren que los médicos comiencen a hablar accidentalmente con el servidor Nuance Dragon, que no es compatible con HIPAA. Entonces, estaba buscando formas de suprimir la tecla de dictado en el teclado.Deshabilitar el botón de dictado en el teclado del iPhone 4S/nuevo iPad

Intenté poner un botón falso en el botón de dictado en el teclado, pero en el iPad el concepto de plataforma dividida sigue moviendo el micrófono por toda la pantalla. Esto no suena como una solución razonable. ¿Hay expertos por ahí que puedan ayudarme?

Respuesta

13

OKAY, finalmente lo tengo! El truco es observar las notificaciones de cambio de UITextInputMode y luego reunir el identificador del modo cambiado (el código parece evitar el uso directo de la API privada, aunque parece requerir un poco de conocimiento de la API privada en general), y cuando el modo cambia a dictado, resignFirstResponder (que cancelará el dictado de voz). ¡HURRA! Aquí hay un código:

En algún lugar de delegado de la aplicación (al menos eso es donde lo puse)

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

Y entonces usted puede

UIView *resignFirstResponder(UIView *theView) 
{ 
    if([theView isFirstResponder]) 
    { 
     [theView resignFirstResponder]; 
     return theView; 
    } 
    for(UIView *subview in theView.subviews) 
    { 
     UIView *result = resignFirstResponder(subview); 
     if(result) return result; 
    } 
    return nil; 
} 

- (void)inputModeDidChange:(NSNotification *)notification 
{   
    // Allows us to block dictation 
    UITextInputMode *inputMode = [UITextInputMode currentInputMode]; 
    NSString *modeIdentifier = [inputMode respondsToSelector:@selector(identifier)] ? (NSString *)[inputMode performSelector:@selector(identifier)] : nil; 

    if([modeIdentifier isEqualToString:@"dictation"]) 
    { 
     [UIView setAnimationsEnabled:NO]; 
     UIView *resigned = resignFirstResponder(window); 
     [resigned becomeFirstResponder]; 
     [UIView setAnimationsEnabled:YES]; 

     UIAlertView *denyAlert = [[[UIAlertView alloc] initWithTitle:@"Denied" message:nil delegate:nil cancelButtonTitle:@"Okay" otherButtonTitles:nil] autorelease]; 
     [denyAlert show]; 
    } 
} 
+0

Esta es la única solución de trabajo que yo sepa. Aunque los documentos oficiales dicen que UITextView se ajusta al protocolo UITextInput y que comienza en iOS 5.1, se agregaron los nuevos métodos de dictado, pero los métodos de dictado nunca se llaman directamente cuando se usa una subclase UITextView. Parece ser un error conocido de acuerdo con los foros de Apple Dev. De todos modos, ¿enviaste una aplicación usando este fragmento de código sin ningún problema? Solo trato de ahorrarme la frustración de ser rechazado. Espero que sea un error conocido, Apple podría hacer una excepción aquí ... –

+0

Esto no funciona para iPad en realidad ... (notificación diferente) Estaba pensando el otro día que usar el altavoz de alguna manera o el servicio VOIP el registro/activación puede desactivar el botón.Me di cuenta de un error de Google Voice donde anotar se desactiva en ocasiones que podría ser la pista. – BadPirate

+0

No veo cómo llamar al "identificador" de método no documentado en UITextInputMode no califica como API privada –

10

puede crear su propio teclado y ajustar la inputView para los campos de texto que aceptarán este dictado. luego, cuando presionen cualquier tecla, obtendrán su teclado, por lo tanto, no tienen que anular las teclas en el teclado estándar, podrán personalizarlo todo.

self.myButton.inputView = self.customKeyboardView; 

aquí es un ejemplo de un teclado extremadamente personalizada

http://blog.carbonfive.com/2012/03/12/customizing-the-ios-keyboard/

Ray también tiene un tutorial fenomenales en los teclados personalizados.

http://www.raywenderlich.com/1063/ipad-for-iphone-developers-101-custom-input-view-tutorial

Yo espero que ayude.

+0

Esta es la solución que estoy buscando actualmente ... Parece ser una que funcionaría, maldita sea la vergüenza es tener que reprogramar el teclado yo mismo ... (Por ejemplo, la pequeña lupa cuando pones el dedo sobre un personaje , etc ...) ¿Conoce algún proyecto de GitHub/Open Source que brinde buenos teclados alternativos? – BadPirate

+0

Traté de google para algunos antes de hacer mi respuesta. Lamentablemente no encontré ninguno. Si creas en. podrías considerar ponerlo en github para que otros trabajen con él, y tal vez ayudar a agregar :) –

+0

Sí, estoy en el mismo barco. Podría tener que hacer que mi clase esté disponible una vez que la escriba para que otras personas no tengan este problema. – BadPirate

0

Puede hacer una subclase de UITextField/UITextView que invalide insertDictationResult: para no insertar nada.

Esto no evitará que se envíe la información, pero podría mostrar una alerta informándoles de la recámara.

+0

Solución interesante. ¿Sabe algo de lo que se llama antes de que comience el dictado, de modo que se puede alertar al usuario antes de decir cualquier cosa que pueda filtrar información privada? – BadPirate

+1

Desafortunadamente no. Recibes una notificación de finalización de la grabación (dictationRecordingDidEnd), pero no hay manera de cancelar la transmisión al servidor (como entiendo es que comienza a cargarse tan pronto como se inicia la grabación). – BarrettJ

7

Tuve el mismo problema y la única forma que encontré que oculta el botón de dictado es cambiar el tipo de teclado. Para mí cambiarlo al tipo de correo electrónico parecía razonable:

textField.keyboardType = UIKeyboardTypeEmailAddress; 
+0

Esta es una solución simple y viable gracias. Nota: Si su UITextview es una propiedad, también puede agregar el tipo de teclado, es decir self.myTextView.keyboardType = UIKeyboard ETC; – timothykc

Cuestiones relacionadas