我的手机安装了两个语音搜索:Google 应用程序和 S-voice 应用程序。默认应用程序是 S-voice 应用程序,如下图所示。我的问题是,我们如何在Android 6.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;
}
当我的输入是时,上面的函数总是返回 truecom.samsung.voiceserviceplatform
。另一方面,默认应用程序总是返回com.google.android.googlequicksearchbox
(表示谷歌语音)
The DefaultAssistPreference https://github.com/android/platform_packages_apps_settings/blob/master/src/com/android/settings/applications/DefaultAssistPreference.java#L175使用隐藏方法AssistUtils https://github.com/android/platform_frameworks_base/blob/master/core/java/com/android/internal/app/AssistUtils.java#L135-L157检索当前的辅助。您可以使用反射来使用相同的方法:
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
, but AssistUtils
还有一个fallback https://github.com/android/platform_frameworks_base/blob/master/core/java/com/android/internal/app/AssistUtils.java#L142-L155如果设置无效。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)