Как использовать PackageManager.addPreferredActivity()?
В SDK 1.5 я использовал класс PackageManager, чтобы выбрать предпочтительный домашний экран для моего приложения, используя PackageManager.addPackageToPreferred(). В новом SDK (с использованием 2.1) это было устарело, поэтому я пытаюсь использовать addPreferredActivity() для того же результата, но он не работает должным образом.
Некоторый необходимый фон. Я пишу приложение для замены экрана блокировки, поэтому я хочу, чтобы домашний ключ запускал мое приложение (которое уже будет запущено, что приведет к отключению ключа). Когда пользователь "разблокирует" экран, я намереваюсь восстановить отображение, так что все работает нормально.
В моем AndroidManifest.xml у меня есть:
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
<category android:name="android.intent.category.HOME"/>
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
<uses-permission android:name="android.permission.SET_PREFERRED_APPLICATIONS">
</uses-permission>
В моем коде у меня есть следующий фрагмент:
// Set as home activity
// This is done so we can appear to disable the Home key.
PackageManager pm = getPackageManager();
//pm.addPackageToPreferred(getPackageName());
IntentFilter filter = new IntentFilter("android.intent.action.MAIN");
filter.addCategory("android.intent.category.HOME");
filter.addCategory("android.intent.category.DEFAULT");
ComponentName[] components = new ComponentName[]
{
new ComponentName("com.android.launcher", ".Launcher")
};
Context context = getApplicationContext();
ComponentName component = new ComponentName(context.getPackageName(),
MyApp.class.getName());
pm.clearPackagePreferredActivities("com.android.launcher");
pm.addPreferredActivity(filter, IntentFilter.MATCH_CATEGORY_EMPTY,
components, component);
Полученное поведение заключается в том, что прибор выбора приложений появляется, когда я нажимаю клавишу "Домой", что указывает на то, что работает вызов clearPackagePreferredActivities(), но мое приложение не добавилось как предпочтительное. Кроме того, первая строка в журнале ниже говорит о "отбрасывании предпочтительной активности для Intent":
04-06 02: 34: 42.379: INFO/PackageManager (1017): набор результатов изменен, отбрасывается предпочтительная активность для Intent {act = android.intent.action.MAIN cat = [android.intent.category.HOME] flg = 0x10200000} тип null
04-06 02: 34: 42.379: INFO/ActivityManager (1017): Начальная активность: Intent {act = android.intent.action.MAIN cat = [android.intent.category.HOME] flg = 0x10200000 cmp = android/com.android.internal.app.ResolverActivity}
Кто-нибудь знает, что означает это первое сообщение журнала? Может быть, я не использую API правильно, любые идеи? Любая помощь будет принята с благодарностью.
Ответы
Ответ 1
@afonseca: Я имел дело с той же проблемой. Спасибо за код, я использовал его для начала. Также благодарит Шимона. Я объединил свой ответ в свою. У меня код работает (на 1.6 и 2.1 обновление 1). Он был скорректирован немного, но 2 основные изменения, по-видимому, являются предложением Shimons и: ".Launcher" был изменен на "com.android.launcher.Launcher". Рабочий код размещен ниже.
Ciao, a2ronus
PackageManager pm = getPackageManager();
IntentFilter filter = new IntentFilter();
filter.addAction("android.intent.action.MAIN");
filter.addCategory("android.intent.category.HOME");
filter.addCategory("android.intent.category.DEFAULT");
Context context = getApplicationContext();
ComponentName component = new ComponentName(context.getPackageName(), TestReplaceHomeAppActivity.class.getName());
ComponentName[] components = new ComponentName[] {new ComponentName("com.android.launcher", "com.android.launcher.Launcher"), component};
pm.clearPackagePreferredActivities("com.android.launcher");
pm.addPreferredActivity(filter, IntentFilter.MATCH_CATEGORY_EMPTY, components, component);
Ответ 2
Этот ответ может немного запоздать, но API docs говорит для clearPackagePreferredActivities
:
Приложение может очищать только свой пакет (ы).
Итак, я думаю, что в "восстановлении отображения" единственное, что вы можете сделать, это что-то вроде:
getPackageManager().clearPackagePreferredActivities(getPackageName());
и очистить настройку по умолчанию для экрана HOME.
Ответ 3
Кажется, это работает для меня, если я инициализирую массив components
в ALL HOME
приложениях на устройстве:
ComponentName[] components = new ComponentName[]
{
new ComponentName("com.intuitiveui.android", "com.intuitiveui.android.Friday"),
new ComponentName("com.android.launcher2","com.android.launcher2.Launcher")
};
Моя проблема заключается в том, как я могу заполнить это динамически.
Ответ 4
addPreferredActivity больше не работает в 2.2, clearPackagePreferredActivities все еще работает, но вы можете только очистить предпочтение пакета, в котором вы его запускаете.
в андроид-группах google есть много сообщений об этой проблеме и официальной позиции google (пока), чтобы не предоставлять вам методы для переопределения пользовательских настроек.