如何通过代码获取 android 中的默认设备辅助应用程序?
How to get default device assistance app in android by code?
我的 phone 安装了两个语音搜索: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;
}
当我的输入是 com.samsung.voiceserviceplatform
时,上面的函数总是 return 为真。另一方面,默认应用总是 returns com.google.android.googlequicksearchbox
(表示 google 语音)
试试这个。
startActivity(new Intent(Intent.ACTION_VOICE_COMMAND).setFlags(Intent.FLAG_ACTIVITY_NEW_TASK));
DefaultAssistPreference
uses an hidden method of AssistUtils
检索当前助攻。您可以使用反射使用相同的方法:
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
也有一个 fallback。
我尝试了 的回答,如果返回的组件是 activity,它确实有效,比如
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"/>
在清单文件中。
最后我用了Activity.java
中的方法
public boolean showAssist(Bundle args)
由AndroidM添加,可以成功启动助手服务。
如果有人正在为此搜索快速的 kotlin 版本:
fun getCurrentlySelecetedDefaultAssistant(context: Context): ComponentName? =
Settings.Secure.getString(context.contentResolver, "assistant").let { assistantIdentifier ->
if (assistantIdentifier.isNotEmpty()) {
ComponentName.unflattenFromString(assistantIdentifier)
} else {
null
}
}
感谢:
就 re-written.
我的 phone 安装了两个语音搜索: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;
}
当我的输入是 com.samsung.voiceserviceplatform
时,上面的函数总是 return 为真。另一方面,默认应用总是 returns com.google.android.googlequicksearchbox
(表示 google 语音)
试试这个。
startActivity(new Intent(Intent.ACTION_VOICE_COMMAND).setFlags(Intent.FLAG_ACTIVITY_NEW_TASK));
DefaultAssistPreference
uses an hidden method of AssistUtils
检索当前助攻。您可以使用反射使用相同的方法:
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
也有一个 fallback。
我尝试了
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"/>
在清单文件中。
最后我用了Activity.java
中的方法public boolean showAssist(Bundle args)
由AndroidM添加,可以成功启动助手服务。
如果有人正在为此搜索快速的 kotlin 版本:
fun getCurrentlySelecetedDefaultAssistant(context: Context): ComponentName? =
Settings.Secure.getString(context.contentResolver, "assistant").let { assistantIdentifier ->
if (assistantIdentifier.isNotEmpty()) {
ComponentName.unflattenFromString(assistantIdentifier)
} else {
null
}
}
感谢: