OSDN Git Service

Make sure cancel is called on tear down.
authorJerome Poichet <jpoichet@google.com>
Wed, 1 Oct 2014 00:54:03 +0000 (17:54 -0700)
committerJerome Poichet <jpoichet@google.com>
Wed, 1 Oct 2014 00:56:27 +0000 (17:56 -0700)
- Make sure cancel is called when consumer of SpeechRecognizer calls
  destroy.
- If consumer goes away, make sure to call cancel as well.

b/17584947 Pressing mic button in Music hoses audio

Change-Id: Ibe1198b37fe6167493a8694f9089d970f1eb07de

core/java/android/speech/RecognitionService.java
core/java/android/speech/SpeechRecognizer.java

index 32b2d8f..45eb0bf 100644 (file)
@@ -91,9 +91,20 @@ public abstract class RecognitionService extends Service {
         }
     };
 
-    private void dispatchStartListening(Intent intent, IRecognitionListener listener) {
+    private void dispatchStartListening(Intent intent, final IRecognitionListener listener) {
         if (mCurrentCallback == null) {
             if (DBG) Log.d(TAG, "created new mCurrentCallback, listener = " + listener.asBinder());
+            try {
+                listener.asBinder().linkToDeath(new IBinder.DeathRecipient() {
+                    @Override
+                    public void binderDied() {
+                        mHandler.sendMessage(mHandler.obtainMessage(MSG_CANCEL, listener));
+                    }
+                }, 0);
+            } catch (RemoteException re) {
+                Log.e(TAG, "dead listener on startListening");
+                return;
+            }
             mCurrentCallback = new Callback(listener);
             RecognitionService.this.onStartListening(intent, mCurrentCallback);
         } else {
index 91c3799..88e2ede 100644 (file)
@@ -396,6 +396,14 @@ public class SpeechRecognizer {
      * Destroys the {@code SpeechRecognizer} object.
      */
     public void destroy() {
+        if (mService != null) {
+            try {
+                mService.cancel(mListener);
+            } catch (final RemoteException e) {
+                // Not important
+            }
+        }
+
         if (mConnection != null) {
             mContext.unbindService(mConnection);
         }