'How to get default device assistance app in android by code?

my phone installed two voice searches: google app and S-voice app. The default app is S-voice app as figure bellow. My question is that how can we get the default voice application using programmingcally in Android 6.0. Thank you in advance

enter image description here

This is what I did

private boolean isMyAppLauncherDefault(String myPackageName) {
    final IntentFilter filter = new IntentFilter(Intent.ACTION_MAIN);
    filter.addCategory(Intent.CATEGORY_HOME);

    List<IntentFilter> filters = new ArrayList<IntentFilter>();
    filters.add(filter);
    List<ComponentName> activities = new ArrayList<ComponentName>();
    final PackageManager packageManager = (PackageManager) getPackageManager();

    packageManager.getPreferredActivities(filters, activities, null);
    for (ComponentName activity : activities) {

        Log.d(TAG,"======packet default:==="+activity.getPackageName());
    }
    for (ComponentName activity : activities) {

        if (myPackageName.equals(activity.getPackageName())) {
            return true;
        }
    }
    return false;
}

The above function is alway return true when my input is com.samsung.voiceserviceplatform. In other hands, the default app always returns com.google.android.googlequicksearchbox (indicates google voice)



Solution 1:[1]

Try this.

startActivity(new Intent(Intent.ACTION_VOICE_COMMAND).setFlags(Intent.FLAG_ACTIVITY_NEW_TASK));

Solution 2:[2]

I try answer from Mattia Maestrini, it did work if returned component is an activity, like

ComponentInfo{com.sec.android.app.sbrowser/com.sec.android.app.sbrowser.SBrowserMainActivity}

but if the component is a service, I meet following problem

java.lang.SecurityException: Not allowed to start service Intent { 
act=android.intent.action.ASSIST cmp=com.google.android.googlequicksearchbox/com.google.android.voiceinteraction.GsaVoiceInteractionService launchParam=MultiScreenLaunchParams { mDisplayId=0 mBaseDisplayId=0 mFlags=0 } } without permission android.permission.BIND_VOICE_INTERACTION

and I do add

<uses-permission android:name="android.permission.BIND_VOICE_INTERACTION"/>

in Manifest file.

At last I use method in Activity.java

public boolean showAssist(Bundle args)

It's added from Android M and it could start assistant service successfully.

Solution 3:[3]

If someone is seaching a quick kotlin version for that:

fun getCurrentlySelecetedDefaultAssistant(context: Context): ComponentName? =
    Settings.Secure.getString(context.contentResolver, "assistant").let { assistantIdentifier ->
        if (assistantIdentifier.isNotEmpty()) {
            ComponentName.unflattenFromString(assistantIdentifier)
        } else {
            null
        }
    }

Thanks to: https://stackoverflow.com/a/40566276/371749 Just re-written.

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 AndroidHacker
Solution 2
Solution 3 cV2