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(); }