Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How can i use ACTION_VOICE_SEARCH_HANDS_FREE in Android 4.1?

I'm trying to use ACTION_VOICE_SEARCH_HANDS_FREE in Android 4.1.

I use this way:

Intent intent = new Intent(RecognizerIntent.ACTION_VOICE_SEARCH_HANDS_FREE);
intent.putExtra(RecognizerIntent.EXTRA_SECURE, true);
startActivityForResult(intent, RECORD_CODE);

It works fine with ACTION_RECOGNIZE_SPEECH but with ACTION_VOICE_SEARCH_HANDS_FREE I has this:

android.content.ActivityNotFoundException: No Activity found to handle Intent { act=android.speech.action.VOICE_SEARCH_HANDS_FREE (has extras) }

How can i use ACTION_VOICE_SEARCH_HANDS_FREE?

like image 249
Rai220 Avatar asked Sep 18 '12 10:09

Rai220


1 Answers

@Kaarel answered correctly, but to supply a little more information:

An activity needs to register the following in the manifest:

    <intent-filter >
        <action android:name="android.speech.action.VOICE_SEARCH_HANDS_FREE" />

        <category android:name="android.intent.category.DEFAULT" />
    </intent-filter>

Google Search is registered for this intent, but it will only react to it when the screen is on and not locked: See below taken from AudioService

private void startVoiceBasedInteractions(boolean needWakeLock) {
        Intent voiceIntent = null;
        // select which type of search to launch:
        // - screen on and device unlocked: action is ACTION_WEB_SEARCH
        // - device locked or screen off: action is ACTION_VOICE_SEARCH_HANDS_FREE
        //    with EXTRA_SECURE set to true if the device is securely locked
        PowerManager pm = (PowerManager)mContext.getSystemService(Context.POWER_SERVICE);
        boolean isLocked = mKeyguardManager != null && mKeyguardManager.isKeyguardLocked();
        if (!isLocked && pm.isScreenOn()) {
            voiceIntent = new Intent(android.speech.RecognizerIntent.ACTION_WEB_SEARCH);
        } else {
            voiceIntent = new Intent(RecognizerIntent.ACTION_VOICE_SEARCH_HANDS_FREE);
            voiceIntent.putExtra(RecognizerIntent.EXTRA_SECURE,
                    isLocked && mKeyguardManager.isKeyguardSecure());
        }
        // start the search activity
        if (needWakeLock) {
            mMediaEventWakeLock.acquire();
        }
        try {
            if (voiceIntent != null) {
                voiceIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK
                        | Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS);
                mContext.startActivity(voiceIntent);
            }
        } catch (ActivityNotFoundException e) {
            Log.w(TAG, "No activity for search: " + e);
        } finally {
            if (needWakeLock) {
                mMediaEventWakeLock.release();
            }
        }

This feature is pretty redundant currently due to this linked bug, where system applications are overriding the priority, thus preventing the user choosing an installed alternative.

Which when you've created such an application and users can't make use of it, is really very annoying............. indeed.

like image 96
brandall Avatar answered Nov 02 '22 12:11

brandall