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のバージョン

テキストシステムは、ディクテーション「キーボード」に変更した後、またはディクテーション「キーボード」から変更した、文書化されていない通知を投稿します。それらのうちの2つは、次の名前で、変更変更の両方で投稿されます。

  • UIKeyboardCandidateCorrectionDidChangeNotification
  • UIKeyboardLayoutDidChangedNotification

2番目のものには奇妙な動詞の活用があることに注意してください。それはタイプミスではありません。(まあ、それは私のタイプミスではありません。)

これらの通知は他の時間にも投稿されるため、単にそれらを観察してディクテーション状態が変更されたと想定することはできません。通知を受け取ったら、さらにチェックを行う必要があります。したがって、これらの通知の1つのオブザーバーとして自分自身を追加します。最初のものは、なくなるか、将来名前が変更される可能性が低いようです。

- (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、名前全体を使用しないことで、AppStoreから拒否される可能性が低くなります。

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 に答える