Пример #1
0
        public override void PromptForInputAsync(string prompt, bool startVoiceRecognizer, Action <string> callback)
        {
            new Thread(() =>
            {
                string input = null;
                ManualResetEvent dialogDismissWait = new ManualResetEvent(false);

                GetMainActivityAsync(true, mainActivity => mainActivity.RunOnUiThread(() =>
                {
                    EditText inputEdit = new EditText(mainActivity);

                    AlertDialog dialog = new AlertDialog.Builder(mainActivity)
                                         .SetTitle("Sensus is requesting input...")
                                         .SetMessage(prompt)
                                         .SetView(inputEdit)
                                         .SetPositiveButton("OK", (o, e) =>
                    {
                        input = inputEdit.Text;
                    })
                                         .SetNegativeButton("Cancel", (o, e) => { })
                                         .Create();

                    // SetOnDismissListener was added to the AlertDialog.Builder class at API level 17. Call it here to keep us at API level 16.
                    dialog.SetOnDismissListener(new AndroidOnDismissListener(() =>
                    {
                        dialogDismissWait.Set();
                    }));

                    ManualResetEvent dialogShowWait = new ManualResetEvent(false);

                    dialog.SetOnShowListener(new AndroidOnShowListener(() =>
                    {
                        dialogShowWait.Set();
                    }));

                    // dismiss the keyguard when dialog appears
                    dialog.Window.AddFlags(global::Android.Views.WindowManagerFlags.DismissKeyguard);
                    dialog.Window.AddFlags(global::Android.Views.WindowManagerFlags.ShowWhenLocked);
                    dialog.Window.AddFlags(global::Android.Views.WindowManagerFlags.TurnScreenOn);
                    dialog.Window.SetSoftInputMode(global::Android.Views.SoftInput.StateAlwaysVisible);

                    // dim whatever is behind the dialog
                    dialog.Window.AddFlags(global::Android.Views.WindowManagerFlags.DimBehind);
                    dialog.Window.Attributes.DimAmount = 0.75f;

                    dialog.Show();

                    #region voice recognizer
                    if (startVoiceRecognizer)
                    {
                        new Thread(() =>
                        {
                            // wait for the dialog to be shown so it doesn't hide our speech recognizer activity
                            dialogShowWait.WaitOne();

                            // there's a slight race condition between the dialog showing and speech recognition showing. pause here to prevent the dialog from hiding the speech recognizer.
                            Thread.Sleep(1000);

                            Intent intent = new Intent(RecognizerIntent.ActionRecognizeSpeech);
                            intent.PutExtra(RecognizerIntent.ExtraLanguageModel, RecognizerIntent.LanguageModelFreeForm);
                            intent.PutExtra(RecognizerIntent.ExtraSpeechInputCompleteSilenceLengthMillis, 1500);
                            intent.PutExtra(RecognizerIntent.ExtraSpeechInputPossiblyCompleteSilenceLengthMillis, 1500);
                            intent.PutExtra(RecognizerIntent.ExtraSpeechInputMinimumLengthMillis, 15000);
                            intent.PutExtra(RecognizerIntent.ExtraMaxResults, 1);
                            intent.PutExtra(RecognizerIntent.ExtraLanguage, Java.Util.Locale.Default);
                            intent.PutExtra(RecognizerIntent.ExtraPrompt, prompt);

                            mainActivity.GetActivityResultAsync(intent, AndroidActivityResultRequestCode.RecognizeSpeech, result =>
                            {
                                if (result != null && result.Item1 == Result.Ok)
                                {
                                    IList <string> matches = result.Item2.GetStringArrayListExtra(RecognizerIntent.ExtraResults);
                                    if (matches != null && matches.Count > 0)
                                    {
                                        mainActivity.RunOnUiThread(() =>
                                        {
                                            inputEdit.Text = matches[0];
                                        });
                                    }
                                }
                            });
                        }).Start();
                    }
                    #endregion
                }));

                dialogDismissWait.WaitOne();
                callback(input);
            }).Start();
        }