title: Android SpeechRecognizer Network Error
body: <p>I'm trying to create a continous speech recognition in Android 4.4, simple displaying the spoken words in a TextView, like a dictate. I followed multiple tutorials, like <a href="https://github.com/fcrisciani/android-speech-recognition/blob/master/VoiceRecognition/src/com/speech/fcrisciani/voicerecognition/ContinuousDictationFragment.java" rel="nofollow noreferrer">https://github.com/fcrisciani/android-speech-recognition/blob/master/VoiceRecognition/src/com/speech/fcrisciani/voicerecognition/ContinuousDictationFragment.java</a>, or <a href="https://stackoverflow.com/questions/4975443/is-there-a-way-to-use-the-speechrecognizer-api-directly-for-speech-input">Is there a way to use the SpeechRecognizer API directly for speech input?</a> and implemented the following version:</p>
  
  <pre><code>import java.util.ArrayList;
  
  import android.app.Activity;
  import android.content.Intent;
  import android.graphics.PorterDuff;
  import android.os.Bundle;
  import android.speech.RecognitionListener;
  import android.speech.RecognizerIntent;
  import android.speech.SpeechRecognizer;
  import android.view.KeyEvent;
  import android.view.View;
  import android.widget.ImageButton;
  import android.widget.TextView;
  
  public class VoiceReadActivity extends Activity {
      private ImageButton                 mButtonSpeech;
      private TextView                    mTextView;
  
      private SpeechRecognizer            mSpeechRecognizer = null;
  
      private SpeechRecognizer getSpeechRecognizer() {
          if (mSpeechRecognizer == null) {
              mSpeechRecognizer = SpeechRecognizer.createSpeechRecognizer(this);
              mSpeechRecognizer.setRecognitionListener(new RecognitionListener() {
                  @Override
                  public void onReadyForSpeech(Bundle params) {
                      mButtonSpeech.getBackground().setColorFilter( 0xFFFF0000, PorterDuff.Mode.MULTIPLY );
                  }
  
                  @Override
                  public void onBeginningOfSpeech() {
                      mTextView.append( "BEGINNING TO HEAR..." );
  
                      mButtonSpeech.getBackground().setColorFilter( 0xFFFFFFFF, PorterDuff.Mode.MULTIPLY );
                  }
  
                  @Override
                  public void onBufferReceived(byte[] buffer) {}
  
                  @Override
                  public void onEndOfSpeech() {
                      mTextView.append( "STOP HEARING..." );
  
                      mButtonSpeech.getBackground().setColorFilter( 0xFF00FFFF, PorterDuff.Mode.DST );
                  }
  
                  @Override
                  public void onError(int error) {
                      String message;
                      boolean restart = true;
                      switch (error)
                      {
                          case SpeechRecognizer.ERROR_AUDIO:
                              message = "Audio recording error";
                              break;
                          case SpeechRecognizer.ERROR_CLIENT:
                              message = "Client side error";
                              restart = false;
                              break;
                          case SpeechRecognizer.ERROR_INSUFFICIENT_PERMISSIONS:
                              message = "Insufficient permissions";
                              restart = false;
                              break;
                          case SpeechRecognizer.ERROR_NETWORK:
                              message = "Network error";
                              break;
                          case SpeechRecognizer.ERROR_NETWORK_TIMEOUT:
                              message = "Network timeout";
                              break;
                          case SpeechRecognizer.ERROR_NO_MATCH:
                              message = "No match";
                              break;
                          case SpeechRecognizer.ERROR_RECOGNIZER_BUSY:
                              message = "RecognitionService busy";
                              break;
                          case SpeechRecognizer.ERROR_SERVER:
                              message = "error from server";
                              break;
                          case SpeechRecognizer.ERROR_SPEECH_TIMEOUT:
                              message = "No speech input";
                              break;
                          default:
                              message = "Not recognised";
                              break;
                      }
                      mTextView.append("onError code:" + error + " message: " + mes    sage);
  
                      if (restart) {
                          getSpeechRecognizer().cancel();
                          startVoiceRead();
                      }
                  }
  
                  @Override
                  public void onEvent(int eventType, Bundle params) {}
  
                  @Override
                  public void onPartialResults(Bundle partialResults) {}
  
                  @Override
                  public void onResults(Bundle results) {
                      ArrayList&lt;String&gt; text = results.getStringArrayList(SpeechRecognizer.RESULTS_RECOGNITION);
                      mTextView.append(text.get(0));
                      mTextView.append( ". " );
  
                      startVoiceRead();
                  }
  
                  @Override
                  public void onRmsChanged(float rmsdB) {}
              });
          }       
          return mSpeechRecognizer;
      }
  
      @Override
      protected void onCreate(Bundle savedInstanceState) {
          super.onCreate(savedInstanceState);
          setContentView(R.layout.activity_main);
  
          mButtonSpeech           = (ImageButton)findViewById(R.id.button_speech);
          mTextView               = (TextView)findViewById(R.id.text_slave);
  
          mButtonSpeech.setOnClickListener( new View.OnClickListener() {
              @Override
              public void onClick(View v) {
                  if (mSpeechRecognizer == null) {
                      startVoiceRead();
                  } else {
                      stopVoiceRead();
                  }
              }
          });
      }
  
      public void startVoiceRead() {
          Intent speechIntent = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH);
          speechIntent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL, RecognizerIntent.LANGUAGE_MODEL_FREE_FORM);
          getSpeechRecognizer().startListening(speechIntent);
  
          mButtonSpeech.getBackground().setColorFilter( 0xFFFFFF00, PorterDuff.Mode.MULTIPLY );
      }
  
      public void stopVoiceRead() {
          if (mSpeechRecognizer != null) {
              mSpeechRecognizer.destroy();
              mSpeechRecognizer = null;
          }       
  
          mButtonSpeech.getBackground().setColorFilter( 0xFFFFFFFF, PorterDuff.Mode.DST);
      }
  }
  </code></pre>
  
  <p>I already added permissions to my Android Manifest:</p>
  
  <pre><code>&lt;uses-permission android:name="android.permission.RECORD_AUDIO"/&gt;
  &lt;uses-permission android:name="android.permission.INTERNET"/&gt;
  </code></pre>
  
  <p>The problem is, that the RecognitionListener functions like onBeginningOfSpeech() is called randomly in average every third time I want to activate it threw button presses. Furthermore I don't receive any results, but ErrorCode 2: Network Error, if the RecognitionListener is activated. Even though I followed the tutorials, I wasn't able to spot the difference, making my code not work until now. My LogCat output throws the following errors when pressing the button:</p>
  
  <pre><code>07-04 10:20:22.714: E/DatabaseUtils(869): Writing exception to parcel
  07-04 10:20:22.714: E/DatabaseUtils(869): java.lang.SecurityException: Permission Denial: get/set setting for user asks to run as user -2 but is calling from user 0; this requires android.permission.INTERACT_ACROSS_USERS_FULL
  07-04 10:20:22.714: E/DatabaseUtils(869):   at com.android.server.am.ActivityManagerService.handleIncomingUser(ActivityManagerService.java:14614)
  07-04 10:20:22.714: E/DatabaseUtils(869):   at android.app.ActivityManager.handleIncomingUser(ActivityManager.java:2258)
  07-04 10:20:22.714: E/DatabaseUtils(869):   at com.android.providers.settings.SettingsProvider.call(SettingsProvider.java:663)
  07-04 10:20:22.714: E/DatabaseUtils(869):   at android.content.ContentProvider$Transport.call(ContentProvider.java:325)
  07-04 10:20:22.714: E/DatabaseUtils(869):   at android.content.ContentProviderNative.onTransact(ContentProviderNative.java:275)
  07-04 10:20:22.714: E/DatabaseUtils(869):   at android.os.Binder.execTransact(Binder.java:404)
  07-04 10:20:22.714: E/DatabaseUtils(869):   at dalvik.system.NativeStart.run(Native Method)
  07-04 10:20:22.714: W/ActivityManager(869): Permission Denial: get/set setting for user asks to run as user -2 but is calling from user 0; this requires android.permission.INTERACT_ACROSS_USERS_FULL
  07-04 10:20:22.734: E/VoiceEngineWrapper(16366): getInstance() : get existed VoiceEngine
  07-04 10:20:22.734: E/VSG(16366): VSG: speechEndpointTimeout = 1500
  07-04 10:20:22.734: E/VSG(16366): VSG: DEFAULT_ENDPOINT_MEDIUM is 1750
  07-04 10:20:22.734: E/VSG(16366): VSG: Not using dynamic HANGOVER ... speechEndpointTimeout is 1500
  07-04 10:20:22.734: E/VSG(16366): VSG: SHORT = 400
  07-04 10:20:22.734: E/VSG(16366): VSG: MEDIUM = 750
  07-04 10:20:22.734: E/VSG(16366): VSG: MEDIUM_LONG = 1250
  07-04 10:20:22.734: E/VSG(16366): VSG: LONG = 1750
  07-04 10:20:22.734: E/VSG(16366): VSG: LONG_LONG = 2250
  </code></pre>
  
  <p>But even if I add</p>
  
  <pre><code>&lt;uses-permission android:name="android.permission.INTERACT_ACROSS_USERS_FULL"/&gt;
  </code></pre>
  
  <p>the problems, described above, continue.</p>
  
  <p>Thanks for taking the time to help. This has been a hurdle I haven't been able to get over yet.</p>