如何通过代码获取android中的默认设备辅助应用程序?

bgtovc5b  于 2022-12-16  发布在  Android
关注(0)|答案(4)|浏览(128)

我的手机安装了两个语音搜索:google app和S-voice app。默认的app是S-voice app,如下图所示。我的问题是,如何在Android6.0中编程使用默认的语音应用。提前感谢

我就是这么做的

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;
}

当我的输入是com.samsung.voiceserviceplatform时,上面的函数总是返回true。在其他情况下,默认的应用程序总是返回com.google.android.googlequicksearchbox(表示谷歌语音)

nlejzf6q

nlejzf6q1#

DefaultAssistPreference使用AssistUtils的一个隐藏方法来检索当前的Assist。您可以使用反射来使用相同的方法:

public ComponentName getCurrentAssistWithReflection(Context context) {
    try {
        Method myUserIdMethod = UserHandle.class.getDeclaredMethod("myUserId");
        myUserIdMethod.setAccessible(true);
        Integer userId = (Integer) myUserIdMethod.invoke(null);

        if (userId != null) {
            Constructor constructor = Class.forName("com.android.internal.app.AssistUtils").getConstructor(Context.class);
            Object assistUtils = constructor.newInstance(context);

            Method getAssistComponentForUserMethod = assistUtils.getClass().getDeclaredMethod("getAssistComponentForUser", int.class);
            getAssistComponentForUserMethod.setAccessible(true);
            return (ComponentName) getAssistComponentForUserMethod.invoke(assistUtils, userId);
        }
    } catch (Exception e) {
        e.printStackTrace();
    }

    return null;
}

如果你不想使用反射,你可以直接检查系统设置:

public ComponentName getCurrentAssist(Context context) {
    final String setting = Settings.Secure.getString(context.getContentResolver(), "assistant");

    if (setting != null) {
        return ComponentName.unflattenFromString(setting);
    }

    return null;
}

读取AssistUtils的设置与读取AssistUtils的设置相同,但如果设置无效,AssistUtils也有一个备用设置。

v7pvogib

v7pvogib2#

试试这个。

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

trnvg8h33#

我尝试Mattia Maestrini中的答案,如果返回的组件是一个活动,它确实可以工作,例如

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

但如果组件是服务,则会遇到以下问题

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

我还要补充一点

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

在清单文件中。
最后在www.example.com网站上使用该方法Activity.java

public boolean showAssist(Bundle args)

Android M添加,可以成功启动助手服务。

lnlaulya

lnlaulya4#

如果有人正在寻找一个快速的Kotlin版本:

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

感谢:https://stackoverflow.com/a/40566276/371749刚刚重写。

相关问题