Как получить приложение по умолчанию для помощи устройств в Android по коду?
Мой телефон установил два голосовых поиска: приложение 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;
}
Вышеуказанная функция всегда возвращает true, когда мой ввод com.samsung.voiceserviceplatform
, В других руках приложение по умолчанию всегда возвращает com.google.android.googlequicksearchbox
(указывает на голос Google)
4 ответа
DefaultAssistPreference
использует скрытый метод 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
также имеет запасной вариант, если настройка недействительна.
Я пытаюсь ответить от 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"/>
в файле манифеста.
Наконец я использую метод в Activity.java
public boolean showAssist(Bundle args)
Он добавлен из Android M и может успешно запустить службу помощника.
Попробуй это.
startActivity(new Intent(Intent.ACTION_VOICE_COMMAND).setFlags(Intent.FLAG_ACTIVITY_NEW_TASK));
Если кто-то ищет для этого быструю версию kotlin:
fun getCurrentlySelecetedDefaultAssistant(context: Context): ComponentName? =
Settings.Secure.getString(context.contentResolver, "assistant").let { assistantIdentifier ->
if (assistantIdentifier.isNotEmpty()) {
ComponentName.unflattenFromString(assistantIdentifier)
} else {
null
}
}
Спасибо: /questions/3755925/kak-poluchit-prilozhenie-po-umolchaniyu-dlya-pomoschi-ustrojstv-v-android-po-kodu/3755927#3755927 Только что переписано.