2010-04-06 11 views
19

W SDK 1.5 Korzystałem z klasy PackageManager, aby ustawić preferowany ekran główny jako moją aplikację przy użyciu PackageManager.addPackageToPreferred(). W nowym SDK (przy użyciu wersji 2.1) jest to przestarzałe, więc próbuję użyć metody addPreferredActivity() dla tego samego wyniku, ale nie działa ona zgodnie z oczekiwaniami.Jak korzystać z PackageManager.addPreferredActivity()?

Niektóre niezbędne tło. Piszę aplikację do wymiany ekranu blokady, więc chcę, aby klucz domowy uruchomił moją aplikację (która będzie już działać, co spowoduje wyłączenie klucza). Kiedy użytkownik "odblokuje" ekran, zamierzam przywrócić mapowanie, aby wszystko działało jak normalnie.

W moim AndroidManifest.xml mam:

<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> 

W moim kodu mam następujący fragment:

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

Powstały zachowanie jest, że aplikacja Chooser pojawia się po naciśnięciu Home klucz, który wskazuje, że wywołanie clearPackagePreferredActivities() zadziałało, ale moja aplikacja nie została dodana jako preferowana. Ponadto, pierwsza linia w dzienniku poniżej mówi coś o „upuszczenie preferowaną aktywność na Intencyjny”:

04-06 02: 34: 42,379: INFO/PackageManager (1017): zestaw wyników zmieniło, upuszczając preferowaną aktywność Intent {act = android.intent.action.MAIN cat = [android.intent.category.HOME] flg = 0x10200000} typ null

04-06 02: 34: 42.379: INFO/ActivityManager (1017): Rozpoczęcie działalności Intent {act = android.intent.action.MAIN cat = [android.intent.category.HOME] FLG = 0x10200000 CMP = Android/com.android.internal.app.ResolverActivity}

Do es ktoś wie, co oznacza ten pierwszy komunikat dziennika? Może nie używam API poprawnie, jakieś pomysły? Każda pomoc będzie bardzo ceniona.

+0

Świetne szczegóły na temat pytania. Mam nadzieję, że otrzymasz odpowiedź. Witamy w Stack Overflow. –

Odpowiedz

11

@afonseca: Miałem do czynienia z tym samym problemem. Dzięki za kod, użyłem go na początek. Dziękuję również Shimon. Połączyłem jego odpowiedź z moją. Mam działający kod (w aktualizacji 1.6 i 2.1 1). Zostało to nieco zmienione, ale dwie główne zmiany wydają się być sugestią Shimons i: ".Launcher" zmieniono na "com.android.launcher.Launcher". Działający kod jest zamieszczony poniżej.

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); 
+3

@Shimon: Aby uzyskać listę zainstalowanych aplikacji domowych dynamicznie, możesz zacząć od PackageManager.queryIntentActivities (android.content.Intent, int). Powodzenia, a2ronusie. – a2ronus

+0

Dziękuję wam obojgu, wspaniała odpowiedź. Szkoda, że ​​na początku w dokumentach systemu Android nie było więcej przykładów. – afonseca

+0

Dzięki Matt i a2ronus. Bardzo przydatne. –

2

To wydaje się działać dla mnie, gdybym zainicjować tablicę components do ALL HOME aplikacji na urządzeniu:

ComponentName[] components = new ComponentName[] 
{ 
    new ComponentName("com.intuitiveui.android", "com.intuitiveui.android.Friday"), 
    new ComponentName("com.android.launcher2","com.android.launcher2.Launcher") 
}; 

Moim problemem jest to, jak mam wypełnić ten dynamicznie.

1

addPreferredActivity już nie działa w 2.2, clearPackagePreferredActivities nadal działa, ale można tylko wyraźną preferencję dla pakietu uruchomieniu tego dnia.

Istnieje wiele wątków na grupach google w Androidzie dotyczących tego problemu i oficjalna pozycja google (na razie), aby nie zapewniać metod zastępowania preferencji użytkownika.

4

Ta odpowiedź może przyjść trochę późno ale Dokumentacja API mówi o clearPackagePreferredActivities:

aplikacja może tylko jasne własny pakiet (y).

Tak, myślę, że można zrobić tylko w „przywracaniu mapowanie” jest coś takiego:

getPackageManager().clearPackagePreferredActivities(getPackageName()); 

i tak wyczyszczenie domyślne ustawienie ekranu HOME.

+0

To naprawdę działa. – AB1209