Hopefully fixed the leaked service connection problems, added some error handling

pull/14/head
Sam Bosley 12 years ago
parent 998d990ecb
commit 4e85017921

@ -30,6 +30,7 @@ public class RecognizerApi implements RecognitionListener {
public static interface RecognizerApiListener {
public void onSpeechResult(String result);
public void onSpeechError(int error);
}
private RecognizerApiListener mListener;
@ -79,7 +80,7 @@ public class RecognizerApi implements RecognitionListener {
private ProgressDialog speakPd;
private ProgressDialog processingPd;
public void write() {
public void start() {
sr.setRecognitionListener(this);
Intent intent = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH);
@ -119,6 +120,10 @@ public class RecognizerApi implements RecognitionListener {
}
}
public void cancel() {
sr.cancel();
}
public void destroy() {
sr.destroy();
}
@ -161,6 +166,7 @@ public class RecognizerApi implements RecognitionListener {
sr.cancel();
}
});
processingPd.show();
long delta = System.currentTimeMillis() - speechStarted;
@ -181,6 +187,8 @@ public class RecognizerApi implements RecognitionListener {
@Override
public void onError(int error) {
if (mListener != null)
mListener.onSpeechError(error);
Log.w("Speech Error", "Error code: " + error);
}
@ -227,7 +235,7 @@ public class RecognizerApi implements RecognitionListener {
findViewById(R.id.write).setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
api.write();
api.start();
}
});
@ -251,5 +259,10 @@ public class RecognizerApi implements RecognitionListener {
((TextView)findViewById(R.id.text)).setText(result);
api.convert(M4A_FILE);
}
@Override
public void onSpeechError(int error) {
// TODO Auto-generated method stub
}
}
}

@ -2,4 +2,8 @@
<!-- See the file "LICENSE" for the full license governing this code. -->
<resources xmlns:android="http://schemas.android.com/apk/res/android">
<string name="speech_err_network">Network error! Speech recognition requires a network connection to work.</string>
<string name="speech_err_no_match">Sorry, I couldn\'t understand that! Please try again.</string>
<string name="speech_err_default">Sorry, speech recognition encountered an error. Please try again.</string>
</resources>

@ -575,11 +575,13 @@ public class TaskListFragment extends ListFragment implements OnScrollListener,
@Override
public void onStart() {
super.onStart();
quickAddBar.setupRecognizerApi();
}
@Override
public void onStop() {
super.onStop();
quickAddBar.destroyRecognizerApi();
}
@Override

@ -8,6 +8,7 @@ import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.net.Uri;
import android.speech.SpeechRecognizer;
import android.text.TextUtils;
import android.util.AttributeSet;
import android.view.KeyEvent;
@ -20,6 +21,7 @@ import android.widget.ImageButton;
import android.widget.LinearLayout;
import android.widget.TextView;
import android.widget.TextView.OnEditorActionListener;
import android.widget.Toast;
import com.timsu.astrid.R;
import com.todoroo.aacenc.RecognizerApi;
@ -107,9 +109,6 @@ public class QuickAddBar extends LinearLayout implements RecognizerApiListener {
activity = myActivity;
fragment = myFragment;
recognizerApi = new RecognizerApi(activity);
recognizerApi.setListener(this);
DependencyInjectionService.getInstance().inject(this);
LayoutInflater.from(activity).inflate(R.layout.quick_add_bar, this);
@ -170,7 +169,7 @@ public class QuickAddBar extends LinearLayout implements RecognizerApiListener {
currentVoiceFile = Long.toString(DateUtilities.now());
recognizerApi.setTemporaryFile(currentVoiceFile);
recognizerApi.write();
recognizerApi.start();
}
});
@ -450,11 +449,46 @@ public class QuickAddBar extends LinearLayout implements RecognizerApiListener {
return false;
}
public void setupRecognizerApi() {
if (recognizerApi != null)
recognizerApi.destroy();
recognizerApi = new RecognizerApi(activity);
recognizerApi.setListener(this);
}
public void destroyRecognizerApi() {
recognizerApi.destroy();
recognizerApi = null;
}
@Override
public void onSpeechResult(String result) {
quickAddBox.setText(result);
}
@Override
public void onSpeechError(int error) {
recognizerApi.cancel();
int errorStr = 0;
switch(error) {
case SpeechRecognizer.ERROR_NETWORK:
case SpeechRecognizer.ERROR_NETWORK_TIMEOUT:
errorStr = R.string.speech_err_network;
break;
case SpeechRecognizer.ERROR_NO_MATCH:
Toast.makeText(activity, R.string.speech_err_no_match, Toast.LENGTH_LONG);
break;
default:
errorStr = R.string.speech_err_default;
break;
}
if (errorStr > 0)
DialogUtilities.okDialog(activity, activity.getString(errorStr), null);
}
public void hideKeyboard() {
InputMethodManager imm = (InputMethodManager) activity.getSystemService(
Context.INPUT_METHOD_SERVICE);

Loading…
Cancel
Save