text: Q:
  
  ¿Por qué no está funcionando el método stopListening()? Android Java
  
  Veréis, tengo en mi aplicación un botón para que se pueda transcribir de voz lo que queramos decir. El problema es que he creado un contador en el botón para que cuando pulse el botón nuevamente, pare de escuchar, pero no funciona:
  public class MainActivity extends AppCompatActivity {
  
  private static final int MY_PERMISSIONS_RECORD_AUDIO = 1;
  int count = 0;
  SpeechRecognizer mSpeechRecognizer;
  Intent mSpeechRecognizerIntent;
  @BindView(R.id.etBeforeTranslate)
  EditText etBeforeTranslate;
  @BindView(R.id.ivLogo)
  ImageView ivLogo;
  @BindView(R.id.btnTranslate)
  Button btnTranslate;
  @BindView(R.id.btnVoice)
  ImageButton btnVoice;
  
  private DatabaseReference Translates;
  
  public String removeAccents() {...}
  
  public String textTranslate() {...}
  
  public void registerTranslates() {...}
  
  private void checkPermission() {
  
      if (ContextCompat.checkSelfPermission(this,
              Manifest.permission.RECORD_AUDIO)
              != PackageManager.PERMISSION_GRANTED) {
  
          //When permission is not granted by user, show them message why this permission is needed.
          if (ActivityCompat.shouldShowRequestPermissionRationale(this,
                  Manifest.permission.RECORD_AUDIO)) {
              //Give user option to still opt-in the permissions
              ActivityCompat.requestPermissions(this,
                      new String[]{Manifest.permission.RECORD_AUDIO},
                      MY_PERMISSIONS_RECORD_AUDIO);
  
          } else {
              // Show user dialog to grant permission to record audio
              ActivityCompat.requestPermissions(this,
                      new String[]{Manifest.permission.RECORD_AUDIO},
                      MY_PERMISSIONS_RECORD_AUDIO);
          }
      }
      //If permission is granted, then go ahead recording audio
      else if (ContextCompat.checkSelfPermission(this,
              Manifest.permission.RECORD_AUDIO)
              == PackageManager.PERMISSION_GRANTED) {
  
          //Go ahead with recording audio now
          speechToText();
      }
  
  }
  
  private void speechToText() {
  
      mSpeechRecognizer = SpeechRecognizer.createSpeechRecognizer(this);
      mSpeechRecognizerIntent = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH);
      mSpeechRecognizerIntent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL, RecognizerIntent.LANGUAGE_MODEL_FREE_FORM);
      mSpeechRecognizerIntent.putExtra(RecognizerIntent.EXTRA_LANGUAGE, Locale.getDefault());
  
      mSpeechRecognizer.setRecognitionListener(new RecognitionListener() {
          @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) {
              ArrayList<String> matches = results.getStringArrayList(SpeechRecognizer.RESULTS_RECOGNITION);
              if (matches != null) {
                  etBeforeTranslate.setText(matches.get(0));
  
              }
          }
  
          @Override
          public void onPartialResults(Bundle partialResults) {
  
          }
  
          @Override
          public void onEvent(int eventType, Bundle params) {
  
          }
      });
  
      mSpeechRecognizer.startListening(mSpeechRecognizerIntent);
  
      count = 1;
  
  }
  
  @Override
  public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) {
      switch (requestCode) {
          case MY_PERMISSIONS_RECORD_AUDIO: {
              if (grantResults.length > 0
                      && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                  // permission was granted, yay!
                  speechToText();
              } else {
                  // permission denied, boo! Disable the
                  // functionality that depends on this permission.
                  Toast.makeText(this, "Vaya, pues te quedas sin hablarme", Toast.LENGTH_LONG).show();
              }
              return;
          }
      }
  }
  
  @Override
  protected void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.activity_main);
      ButterKnife.bind(this);
  
      btnVoice.setOnClickListener(new View.OnClickListener() {
          @Override
          public void onClick(View v) {
  
              if (count == 0) {
  
                  checkPermission();
                  speechToText();
              }
  
              else if (count == 1) {
  
                  mSpeechRecognizer.stopListening();
                  etBeforeTranslate.setText("holi");
              }
  
          }
      });
  
      btnTranslate.setOnClickListener(new View.OnClickListener() {
          @Override
          public void onClick(View v) {
  
              String texto = textTranslate();
  
              if (etBeforeTranslate.getText().toString().trim().isEmpty()) {
  
                  ivLogo.setImageResource(R.drawable.logotipoangry);
                  Toast.makeText(MainActivity.this, "¡Ay que agobio! Intridici il tixti, anda", Toast.LENGTH_SHORT).show();
  
              } else {
  
                  Translates = FirebaseDatabase.getInstance().getReference("Translates");
                  registerTranslates();
                  ivLogo.setImageResource(R.drawable.logotipo);
                  Intent intent = new Intent(MainActivity.this, TranslateActivity.class);
                  intent.putExtra("texto", texto);
                  startActivity(intent);
  
              }
  
          }
      });
  
  }
  
  }
  
  El texto que metí era para comprobar que me lo mostrara para ver que se estaba realizando y efectivamente cambia, me lo muestra, es decir que entra, pero que va, no me salta el sonido como que ha parado de escuchar y ya no se si es problema de mi aplicación o de terceros, ya que leí en respuestas de hace años que no iba bien ese servicio, pero supongo que con el paso de los años se solucionó. A ver si me podéis echar una mano, muchas gracias :)
  
  A:
  
  Como lo mencionas, hace tiempo se tenía un "bug" en SpeechRecognizer.stopListening() el cual fue "solucionado", a mi parecer fue en realidad el uso incorrecto de este método.
  Si en realidad si deseas terminar el servicio de reconocimiento de voz, realizalo mediante:
  mSpeechRecognizer.cancel();
  mSpeechRecognizer.destroy(); 
  
  Por cierto es buena práctica liberar recursos, realizando el mismo llamado en el método onDestroy() de tu Activity:
  @Override
    protected void onDestroy() {
      super.onDestroy();
      //libera recursos.
      if(mSpeechRecognizer != null){
         mSpeechRecognizer.cancel();
         mSpeechRecognizer.destroy();
      }
    }
  
  .cancel() Termina el servicio de reconocimiento de voz.
  
  .destroy() Destruye el objeto SpeechRecognizer.
  
  