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.
In my case, error message is "9/Insufficient permissions"
Solved by giving Microphone permission to Google app
Reference : https://github.com/react-native-voice/voice/issues/253#issuecomment-812726040
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:
void doPermAudio()
{
int MY_PERMISSIONS_RECORD_AUDIO = 1;
MainActivity thisActivity = this;
if (ContextCompat.checkSelfPermission(this,
Manifest.permission.RECORD_AUDIO)
!= PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(thisActivity,
new String[]{Manifest.permission.RECORD_AUDIO},
MY_PERMISSIONS_RECORD_AUDIO);
}
}
}
// in main activity's onCreate
protected void onCreate(Bundle savedInstanceState) {
this.runOnUiThread(new Runnable() {
@Override
public void run() {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
doPermAudio();
}
}
});
}
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:
void listen()
{
runOnUiThread(new Runnable() {
@Override
public void run() {
Intent intent = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH);
intent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL, RecognizerIntent.LANGUAGE_MODEL_FREE_FORM);
String pkg = getApplication().getPackageName();
intent.putExtra(RecognizerIntent.EXTRA_CALLING_PACKAGE, pkg);
sr.startListening(intent);
}
});
}
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.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With