diff --git a/core/java/android/speech/RecognitionService.java b/core/java/android/speech/RecognitionService.java index 8b4c0d9e21f5d..8fb999e2aeab3 100644 --- a/core/java/android/speech/RecognitionService.java +++ b/core/java/android/speech/RecognitionService.java @@ -120,9 +120,15 @@ public abstract class RecognitionService extends Service { } mCurrentCallback = new Callback(listener, attributionSource); - RecognitionService.this.onStartListening(intent, mCurrentCallback); - if (!checkPermissionAndStartDataDelivery()) { + boolean preflightPermissionCheckPassed = + checkPermissionForPreflight(); + if (preflightPermissionCheckPassed) { + RecognitionService.this.onStartListening(intent, mCurrentCallback); + } + if (!preflightPermissionCheckPassed || !checkPermissionAndStartDataDelivery()) { listener.onError(SpeechRecognizer.ERROR_INSUFFICIENT_PERMISSIONS); + RecognitionService.this.onCancel(mCurrentCallback); + dispatchClearCallback(); Log.i(TAG, "caller doesn't have permission:" + Manifest.permission.RECORD_AUDIO); } @@ -459,6 +465,12 @@ public abstract class RecognitionService extends Service { return mStartedDataDelivery; } + private boolean checkPermissionForPreflight() { + return PermissionChecker.checkPermissionForPreflight(RecognitionService.this, + Manifest.permission.RECORD_AUDIO, mCurrentCallback.getAttributionContextForCaller() + .getAttributionSource()) == PermissionChecker.PERMISSION_GRANTED; + } + void finishDataDelivery() { if (mStartedDataDelivery) { mStartedDataDelivery = false;