I am using google speech recognizer for integrating voice services in Android but while pressing on mic button this annoying toast message is showing. Please suggest me a way to
You can make a custom speech recogniser which will give you more control over the UI. MainActivity opens a new DialogFragment which implements RecognitionListener .
public class MainActivity extends AppCompatActivity implements VoiceRecognizerInterface {
Button button ;
TextView textView;
String string;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
button = findViewById(R.id.button);
textView = findViewById(R.id.textView);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
FragmentManager fragmentManager = getSupportFragmentManager();
if (fragmentManager != null && fragmentManager.findFragmentByTag("dialogVoiceRecognizer") == null && !isFinishing()) {
VoiceRecognizerDialogFragment languageDialogFragment = new VoiceRecognizerDialogFragment(MainActivity.this,MainActivity.this);
languageDialogFragment.show(fragmentManager, "dialogVoiceRecognizer");
}
}
});
}
@Override
public void spokenText(String spokenText) {
textView.setText(spokenText);
}
}
An interface to signal the main activity after stt.
public interface VoiceRecognizerInterface {
void spokenText(String spokenText);
}
The custom SpeechToText Dialog.
public class VoiceRecognizerDialogFragment extends DialogFragment implements RecognitionListener{
ImageView micImage;
TextView stateTV;
TextView displayTV;
private SpeechRecognizer mSpeechRecognizer;
private Intent mSpeechRecognizerIntent;
private Context context;
VoiceRecognizerInterface signal;
@SuppressLint("ValidFragment")
public VoiceRecognizerDialogFragment(Context context, VoiceRecognizerInterface signal) {
this.context = context;
this.signal = signal;
}
public VoiceRecognizerDialogFragment(){
}
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.voice_recognizer_custom_layout ,container, false );
//Mic tap to listen again
micImage = view.findViewById(R.id.micImageView);
//Displays Listening.. when recognizer is listening
stateTV = view.findViewById(R.id.stateTV);
//Displays message if error
displayTV = view.findViewById(R.id.displayTV);
mSpeechRecognizer = SpeechRecognizer.createSpeechRecognizer(context);
mSpeechRecognizerIntent = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH);
mSpeechRecognizerIntent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL,
RecognizerIntent.LANGUAGE_MODEL_WEB_SEARCH);
//Customize language by passing language code
mSpeechRecognizerIntent.putExtra(RecognizerIntent.EXTRA_LANGUAGE,"en");
//To receive partial results on the callback
mSpeechRecognizerIntent.putExtra(RecognizerIntent.EXTRA_PARTIAL_RESULTS,true);
mSpeechRecognizerIntent.putExtra(RecognizerIntent.EXTRA_CALLING_PACKAGE,
context.getPackageName());
mSpeechRecognizer.setRecognitionListener(this);
mSpeechRecognizer.startListening(mSpeechRecognizerIntent);
micImage.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
startListening();
}
});
return view;
}
public void startListening(){
mSpeechRecognizer.setRecognitionListener(this);
mSpeechRecognizer.startListening(mSpeechRecognizerIntent);
changeUIStateToListening();
}
@Override
public void onDestroy() {
super.onDestroy();
if (mSpeechRecognizer != null) {
mSpeechRecognizer.destroy();
}
}
@Override
public void onBeginningOfSpeech()
{
}
@Override
public void onBufferReceived(byte[] buffer)
{
}
@Override
public void onEndOfSpeech()
{
}
@Override
public void onError(int error)
{
if(error == 7){
changeUIStateToRetry();
}
}
@Override
public void onEvent(int eventType, Bundle params)
{
}
@Override
public void onPartialResults(Bundle partialResults) {
}
@Override
public void onReadyForSpeech(Bundle params)
{
}
@Override
public void onResults(Bundle results)
{
ArrayList<String> matches = results.getStringArrayList(SpeechRecognizer.RESULTS_RECOGNITION);
if(matches == null){
return;
}
int i =0;
String first ="";
for(String s : matches){
if(i==0){
first = s;
}
i++;
}
// sending text to MainActivity using Interface
signal.spokenText(first);
this.dismiss();
}
@Override
public void onRmsChanged(float rmsdB)
{
}
public void changeUIStateToListening(){
displayTV.setText("Tell us what you need");
stateTV.setText("Listening...");
}
public void changeUIStateToRetry(){
displayTV.setText("Didn't catch that. Try\nSpeaking again");
stateTV.setText("Tap on mic to try again");
}
}
Based on android regulations you cannot hide system toast messages as you don't have the accesses to the system View,
only in jailbrake android where you have access to the terminal you can try to do that.