6

如何回应开始听写?


响应听写的已知方法:

  • dictationRecordingDidEnd - 响应口述短语的识别完成

  • dictationRecognitionFailed - 响应失败的听写识别。


参考: UITextInput 协议参考

从 iOS 5.1 开始,当用户在支持的设备上选择听写输入时,系统会自动将识别的短语插入到当前文本视图中。UITextInput 协议中的方法允许您的应用响应听写的完成,如“使用听写”中所述。您可以使用 UIDictationPhrase 类的对象来获取表示用户口述短语的字符串。在听写结果不明确的情况下,听写短语对象提供包含替代字符串的数组。

http://developer.apple.com/library/ios/#documentation/uikit/reference/UITextInput_Protocol/Reference/Reference.html

4

3 回答 3

10

据我所知,没有用于检测听写何时开始的公共 API。

如果你真的想做,而且你想进入 App Store,你可能可以通过以下方法侥幸成功,但它完全不受支持无论如何它可能会被你拒绝,并且将来可能会中断iOS 版本

在更改为听写“键盘”或从听写“键盘”更改,文本系统会发布一些未记录的通知。其中两个发布在对它的更改和对它更改上,名称如下:

  • UIKeyboardCandidateCorrectionDidChangeNotification
  • UIKeyboardLayoutDidChangedNotification

请注意,第二个有一个奇怪的动词变位。那不是错字。(好吧,这不是的错字。)

这些通知也会在其他时间发布,因此您不能只是观察它们并假设听写状态已更改。当您收到通知时,您需要进行更多检查。因此,将自己添加为其中一个通知的观察者。第一个似乎不太可能在未来消失或重新命名。

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    [[NSNotificationCenter defaultCenter] addObserver:self
        selector:@selector(checkForDictationKeyboard:)
        name:@"UIKeyboardCandidateCorrectionDidChangeNotification"
        object:nil];
    ...

当您收到通知时,您会想查看听写视图是否正在显示:

- (void)checkForDictationKeyboard:(NSNotification *)note {
    if ([self isShowingDictationView]) {
        NSLog(@"showing dictation view");
    } else {
        NSLog(@"not showing dictation view");
    }
}

要查看它是否显示,请检查除您自己的应用程序窗口之外的每个窗口。通常,唯一的另一个窗口是文本系统的窗口。

- (BOOL)isShowingDictationView {
    for (UIWindow *window in [UIApplication sharedApplication].windows) {
        if (window == self.window)
            continue;
        if (containsDictationView(window))
            return YES;
    }
    return NO;
}

递归遍历视图层次结构,检查其类名包含字符串“DictationView”的视图。实际的类名是UIDictationView但不使用全名,您不太可能被 App Store 拒绝。

static BOOL containsDictationView(UIView *view) {
    if (strstr(class_getName(view.class), "DictationView") != NULL)
        return YES;
    for (UIView *subview in view.subviews) {
        if (containsDictationView(subview))
            return YES;
    }
    return NO;
}
于 2013-02-26T04:30:31.387 回答
10

虽然这个问题得到了回答,但我仍然想添加我的解决方案并希望对其他人有所帮助。

当您点击键盘上的 MIC 按钮时,primaryLanguage将变为dictation。你可以这样检测:

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

- (void) handleCurrentInputModeDidChange:(NSNotification *)notification
{
    NSString *primaryLanguage = [UITextInputMode currentInputMode].primaryLanguage;

    NSLog(@"current primaryLanguage is: %@", primaryLanguage);
}

更新: 正如@user1686700 所说,currentInputMode已被弃用。这不再是解决方案。

于 2013-04-17T01:30:05.973 回答
4

请注意 - UITextInputMode 的currentInputMode自 iOS7 起已弃用。我们可能只需要等到 Apple 决定发布听写 API,以便我们可以根据我们的意图进行有意义的调用。

于 2013-07-18T20:34:58.367 回答