Как я могу использовать PackageManager.addPreferredActivity ()? - PullRequest
19 голосов
/ 06 апреля 2010

В 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);

В результате получается, что средство выбора приложений появляется, когда я нажимаю клавишу Home, что указывает на то, что вызов 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, есть идеи?Любая помощь будет принята с благодарностью.

Ответы [ 4 ]

11 голосов
/ 07 мая 2010

@ afonseca: Я имел дело с той же проблемой. Спасибо за код, я использовал его для начала. Также спасибо Шимон. Я слил его ответ в мой. У меня работает код (на 1.6 и 2.1 обновление 1). Он был немного скорректирован, но 2 основных изменения, похоже, являются предложением Шимона, и «.Launcher» был изменен на «com.android.launcher.Launcher». Рабочий код выложен ниже.

Чао, а2ронус

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);
4 голосов
/ 27 апреля 2013

Этот ответ может прийти с некоторым опозданием, но в документации API написано: clearPackagePreferredActivities:

Приложение может очистить только свои собственные пакеты.

Итак, я думаю, что при «восстановлении отображения» вы можете сделать что-то вроде:

getPackageManager().clearPackagePreferredActivities(getPackageName());

и, таким образом, сброс настройки по умолчанию для экрана HOME.

2 голосов
/ 06 мая 2010

Мне кажется, это работает, если я инициализирую массив 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")
};

Моя проблема в том, как мне заполнить это динамически.

1 голос
/ 19 октября 2010

addPreferredActivity больше не работает в 2.2, clearPackagePreferredActivities все еще работает, но вы можете только очистить предпочтения для пакета, на котором вы его запускаете.

В группах android google много тем об этой проблеме и официальной позиции Google (на данный момент) не предоставлять вам способы переопределения предпочтений пользователя.

...