Skip to content
This repository has been archived by the owner on May 23, 2023. It is now read-only.

Add stop listening to Android #61

Open
wants to merge 12 commits into
base: master
Choose a base branch
from
7 changes: 5 additions & 2 deletions package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "cordova-plugin-speechrecognition",
"version": "1.1.2",
"version": "1.1.2-beta.0",
"description": "Cordova Plugin for Speech Recognition",
"cordova": {
"id": "cordova-plugin-speechrecognition",
Expand Down Expand Up @@ -32,5 +32,8 @@
"bugs": {
"url": "https://github.com/pbakondy/cordova-plugin-speechrecognition/issues"
},
"homepage": "https://github.com/pbakondy/cordova-plugin-speechrecognition#readme"
"homepage": "https://github.com/pbakondy/cordova-plugin-speechrecognition#readme",
"publishConfig" : {
"registry" : "https://nexus.pelotoninnovations.com/repository/npm-internal/"
}
}
105 changes: 94 additions & 11 deletions src/android/com/pbakondy/SpeechRecognition.java
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@
import java.util.ArrayList;
import java.util.List;
import java.util.Locale;
import java.util.concurrent.locks.ReentrantLock;

public class SpeechRecognition extends CordovaPlugin {

Expand All @@ -39,6 +40,7 @@ public class SpeechRecognition extends CordovaPlugin {
private static final int REQUEST_CODE_SPEECH = 2002;

private static final String IS_RECOGNITION_AVAILABLE = "isRecognitionAvailable";
private static final String INIT_LISTENING = "initListening";
private static final String START_LISTENING = "startListening";
private static final String STOP_LISTENING = "stopListening";
private static final String GET_SUPPORTED_LANGUAGES = "getSupportedLanguages";
Expand All @@ -53,6 +55,9 @@ public class SpeechRecognition extends CordovaPlugin {

private static final String RECORD_AUDIO_PERMISSION = Manifest.permission.RECORD_AUDIO;

private final ReentrantLock lock = new ReentrantLock();
private boolean listening = false;

private CallbackContext callbackContext;
private LanguageDetailsChecker languageDetailsChecker;
private Activity activity;
Expand All @@ -68,15 +73,7 @@ public void initialize(CordovaInterface cordova, CordovaWebView webView) {
context = webView.getContext();
view = webView.getView();

view.post(new Runnable() {
@Override
public void run() {
recognizer = SpeechRecognizer.createSpeechRecognizer(activity);
SpeechRecognitionListener listener = new SpeechRecognitionListener();
recognizer.setRecognitionListener(listener);
}
});

// initListening();
}

@Override
Expand All @@ -93,6 +90,11 @@ public boolean execute(String action, JSONArray args, CallbackContext callbackCo
return true;
}

if (INIT_LISTENING.equals(action)) {
initListening();
return true;
}

if (START_LISTENING.equals(action)) {
if (!isRecognitionAvailable()) {
callbackContext.error(NOT_AVAILABLE);
Expand Down Expand Up @@ -123,7 +125,8 @@ public boolean execute(String action, JSONArray args, CallbackContext callbackCo
}

if (STOP_LISTENING.equals(action)) {
this.callbackContext.success();
stopListening();
// this.callbackContext.success();
return true;
}

Expand Down Expand Up @@ -154,6 +157,31 @@ private boolean isRecognitionAvailable() {
return SpeechRecognizer.isRecognitionAvailable(context);
}

private void initListening() {
view.post(new Runnable() {
@Override
public void run() {
try {
SpeechRecognition.this.lock.lock();
if (recognizer!=null) {
recognizer.cancel();
recognizer.destroy();
recognizer = null;
}
recognizer = SpeechRecognizer.createSpeechRecognizer(activity);
SpeechRecognitionListener listener = new SpeechRecognitionListener();
recognizer.setRecognitionListener(listener);
SpeechRecognition.this.listening(false);
SpeechRecognition.this.callbackContext.success();
} catch (Exception e) {
SpeechRecognition.this.callbackContext.error("Recognizer init error: " + e.getMessage());
} finally {
SpeechRecognition.this.lock.unlock();
}
}
});
}

private void startListening(String language, int matches, String prompt, Boolean showPopup) {
Log.d(LOG_TAG, "startListening() language: " + language + ", matches: " + matches + ", prompt: " + prompt + ", showPopup: " + showPopup);

Expand All @@ -176,13 +204,52 @@ private void startListening(String language, int matches, String prompt, Boolean
view.post(new Runnable() {
@Override
public void run() {
recognizer.startListening(intent);
try {
SpeechRecognition.this.lock.lock();

// init
if (recognizer!=null) {
recognizer.cancel();
recognizer.destroy();
recognizer = null;
}
recognizer = SpeechRecognizer.createSpeechRecognizer(activity);
SpeechRecognitionListener listener = new SpeechRecognitionListener();
recognizer.setRecognitionListener(listener);

recognizer.startListening(intent);
SpeechRecognition.this.listening(true);
} catch (Exception e) {
// ignore
} finally {
SpeechRecognition.this.lock.unlock();
}
}
});

}
}

private void stopListening() {
view.post(new Runnable() {
@Override
public void run() {
try {
SpeechRecognition.this.lock.lock();
if(SpeechRecognition.this.listening) {
recognizer.stopListening();
SpeechRecognition.this.listening(false);
}
SpeechRecognition.this.callbackContext.success();
} catch (Exception e) {
SpeechRecognition.this.callbackContext.error("Stop listening error: " + e.getMessage());
} finally {
SpeechRecognition.this.lock.unlock();
}
}
});
}

private void getSupportedLanguages() {
if (languageDetailsChecker == null) {
languageDetailsChecker = new LanguageDetailsChecker(callbackContext);
Expand Down Expand Up @@ -249,12 +316,20 @@ public void onActivityResult(int requestCode, int resultCode, Intent data) {
} else {
this.callbackContext.error(Integer.toString(resultCode));
}
SpeechRecognition.this.lock.lock();
SpeechRecognition.this.listening(false);
SpeechRecognition.this.lock.unlock();

return;
}

super.onActivityResult(requestCode, resultCode, data);
}

private void listening(boolean value) {
this.listening = value;
}


private class SpeechRecognitionListener implements RecognitionListener {

Expand All @@ -272,6 +347,10 @@ public void onEndOfSpeech() {

@Override
public void onError(int errorCode) {
SpeechRecognition.this.stopListening();
// SpeechRecognition.this.lock.lock();
// SpeechRecognition.this.listening(false);
// SpeechRecognition.this.lock.unlock();
String errorMessage = getErrorText(errorCode);
Log.d(LOG_TAG, "Error: " + errorMessage);
callbackContext.error(errorMessage);
Expand Down Expand Up @@ -301,6 +380,10 @@ public void onResults(Bundle results) {
} catch (Exception e) {
e.printStackTrace();
callbackContext.error(e.getMessage());
} finally {
SpeechRecognition.this.lock.lock();
SpeechRecognition.this.listening(false);
SpeechRecognition.this.lock.unlock();
}
}

Expand Down