处理RecognizerIntent的空白背景布局

时间:2017-03-22 06:27:12

标签: android-intent android-activity android-widget android-manifest voice-recognition

我是android studio和java的新手。我正在使用语音识别制作应用程序。该应用程序运行正常,但我决定调查此问题。

STT dialog screen after button is pressed

blank background layout if user pressed back or touch outside the STT dialog

如果用户说了什么,活动就可以了。但是,如果用户在对话框外按下或触摸。显示了一个我想避免的空白布局。

此STT活动将通过小部件和应用活动进行调用。

清单中的STT活动

    <activity
        android:name=".RecordActivity"
        android:label="@string/title_record"
        android:theme="@android:style/Theme.Dialog" />

通过Widget启动STT

        Intent popUpIntent = new Intent(context, RecordActivity.class);
        popUpIntent.setAction("com.XXX.XXX.FROM_WIDGET");
        popUpIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        popUpIntent.putExtra("fileName", recordFile.getAbsolutePath());
        context.startActivity(popUpIntent);

通过活动启动STT

        Intent popUpIntent = new Intent(this, RecordActivity.class);
        popUpIntent.putExtra("fileName", recordFile.getAbsolutePath());
        startActivityForResult(popUpIntent , START_RECORD);

STT活动:

public class RecordActivity extends Activity  implements RecognitionListener {

//
private static final int REQUEST_SPEECH_TO_TEXT = 1;

private String fileName;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    promptSpeechInput();
    // Read Filename
    Intent intent = getIntent();
    fileName = intent.getStringExtra("fileName");
}

public void onSubmit(View view) {
    finish();
}

/**
 * Receiving speech input
 * */
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);

    switch (requestCode) {
        case REQUEST_SPEECH_TO_TEXT: {
            if (resultCode == RESULT_OK && null != data) {
                // the resulting text is in the getExtras:
                Bundle bundle = data.getExtras();
                ArrayList<String> matches = bundle.getStringArrayList(RecognizerIntent.EXTRA_RESULTS);

                // Default 
                contentText = matches.get(0);
                Uri audioUri = data.getData();
                ...
                setResult(Activity.RESULT_OK, result);
                finish();
            }
            break;
        }

    }
}

private void promptSpeechInput() {
    Intent voiceIntent = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH);
    voiceIntent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL,
            RecognizerIntent.LANGUAGE_MODEL_FREE_FORM);
    voiceIntent.putExtra(RecognizerIntent.EXTRA_LANGUAGE, Locale.getDefault());
    voiceIntent.putExtra("android.speech.extra.DICTATION_MODE", true);       // can listen for a long time
    voiceIntent.putExtra(RecognizerIntent.EXTRA_SPEECH_INPUT_MINIMUM_LENGTH_MILLIS, 10000);
    voiceIntent.putExtra(RecognizerIntent.EXTRA_SPEECH_INPUT_COMPLETE_SILENCE_LENGTH_MILLIS, 5000);
    voiceIntent.putExtra(RecognizerIntent.EXTRA_SPEECH_INPUT_POSSIBLY_COMPLETE_SILENCE_LENGTH_MILLIS, 5000);
    voiceIntent.putExtra("android.speech.extra.GET_AUDIO_FORMAT", "audio/AMR");
    voiceIntent.putExtra("android.speech.extra.GET_AUDIO", true);
    try {
        startActivityForResult(voiceIntent, REQUEST_SPEECH_TO_TEXT);
    } catch (ActivityNotFoundException a) {
        Toast.makeText(getApplicationContext(),
                getString(R.string.record_audio_denied),
                Toast.LENGTH_SHORT).show();
    }
}

@Override
public void onReadyForSpeech(Bundle params) {

}

@Override
public void onBeginningOfSpeech() {

}

@Override
public void onRmsChanged(float rmsdB) {

}

@Override
public void onBufferReceived(byte[] buffer) {

}

@Override
public void onEndOfSpeech() {

}

@Override
public void onError(int error) {

}

@Override
public void onResults(Bundle results) {

}

@Override
public void onPartialResults(Bundle partialResults) {

}

@Override
public void onEvent(int eventType, Bundle params) {

}

}

在此活动中,请原谅我没有删除那些RecognitionListener方法,因为我打算自己嵌入这些方法,而不是在此活动中使用RecognizerIntent。

实际上,我使用Theme.NoDisplay解决了哔声有效的问题,但STT对话框在出现错误(即没有声音)之前不显示

清单中的STT部分

    <activity
        android:name=".RecordActivity"
        android:label="@string/title_record"
        android:theme="@android:style/Theme.NoDisplay" />

在我看来,几乎没有可能的解决方案:

1)也许一些intent.setAction(“”)或intent.setFlags()会有所帮助 - 大部分是可以实现的

2)“@ android:style / Theme.NoDisplay”实际上可能有用 - 首选

3)在touchizerIntent中添加finish()触摸动作和OnBackpressed - 不太喜欢

4)实现RecognitionListener - 如果以上都不起作用,我将采用这种方式。

5)在后台使用STT作为服务 - 需要更多的工作

=============================================== ================================

好的,谢谢你指出this link和我的选项(4)相同然后我有一些问题通过制作我自己的RecognitionListener来获取音频数据......(对不起,我不需要提及来自RecognizerIntent的文本和音频输出...问题后的问题),我已经用几行获取文本和音频来更新我的活动代码......

在我看来,为了获得音频数据,这种方法缺乏明显的资源。但是从this link我正在看一些代码示例,

  

RecognitionService.Callback说关于bufferReceived

和RecognitionService.Callback是我现在想要了解的。

但回到这个问题,我想知道是否有人可以为我的问题提出一个更简单的方法,因为如果没有,我可能会提出选项6.

6)放置一个花哨的自定义布局来替换空白布局

0 个答案:

没有答案