I am trying to implement speech recognition without the standard dialog (it is working fine with the dialog).
I am getting error code 9 as soon as I try to start listening.
My device is an LG G Stylo (running Android 6.0).
Manifest:
<manifest package="example.com.myapplication"
xmlns:android="http://schemas.android.com/apk/res/android">
<uses-permission android:name="android.permission.RECORD_AUDIO"/>
<application
.....
(also tried adding INTERNET permission even though that shouldn't be necessary since offline recognition should be working)
build.gradle:
compileSdkVersion 23
buildToolsVersion "23.0.2"
defaultConfig {
applicationId "example.com.appname"
minSdkVersion 19
targetSdkVersion 23
versionCode 1
versionName "1.0"
}
Speech recognition code:
private SpeechRecognizer speechRecognizer;
protected void onCreate(Bundle savedInstanceState) {
speechRecognizer = SpeechRecognizer.createSpeechRecognizer(this);
speechRecognizer.setRecognitionListener(new speech_listener());
Intent intent = new intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH);
intent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL,
RecognizerIntent.LANGUAGE_MODEL_FREE_FORM);
intent.putExtra(RecognizerIntent.EXTRA_CALLING_PACKAGE,
getApplication().getPackageName());
intent.putExtra(RecognizerIntent.EXTRA_MAX_RESULTS, 1);
intent.putExtra(RecognizerIntent.EXTRA_LANGUAGE, Locale.ENGLISH);
speechRecognizer.startListening(intent);
Listener (inner) class:
class speech_listener implements RecognitionListener
{
public void onReadyForSpeech(Bundle params){}
public void onBeginningOfSpeech(){}
public void onRmsChanged(float rmsdB){}
public void onBufferReceived(byte[] buffer){}
public void onEndOfSpeech(){}
public void onError(int error){
Log.d("Speech", "error: " + error);
}
public void onResults(Bundle results)
{
ArrayList data = results.getStringArrayList(SpeechRecognizer.RESULTS_RECOGNITION);
String answer = (String)data.get(0);
processAnswer(answer);
}
public void onPartialResults(Bundle partialResults){}
public void onEvent(int eventType, Bundle params){}
}
Any insight would be appreciated.
although the answer is out there, you have to put it together from many pieces. What has worked for me (I was getting the same error):
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<uses-permission android:name="android.permission.BLUETOOTH" />
try to add it if everything else failsin newer versions of android, you also have to request your permission from the user during runtime. It is crucial to do this at the right spot, you cannot run the request for permission just from anywhere in your code, it has to be run from the UI Thread. For me the following worked:
also, what has been mentioned elsewhere, you may get the error 9 for declaring a wrong package name when starting the listening intent, as it seems many people have copied their function from a sample from the web, where the package name is explicitly written out:
On Android 6 this permission is one of dangerous ones which means you need to ask user to confirm it (actually acquire it). Check this and this for more details.
Adding to Sam's answer: When you're developing your app on Android 6, you might not be prompted to approve the "dangerous" Record Audio (Microphone) permission, so you need to manually open up the app in Settings and grant the permission.