2010-04-06 4 views
19

En SDK 1.5 Estaba usando la clase PackageManager para configurar la pantalla de inicio preferida para que sea mi aplicación usando PackageManager.addPackageToPreferred(). En el nuevo SDK (usando 2.1) esto ha quedado obsoleto, por lo que estoy tratando de usar addPreferredActivity() para el mismo resultado, pero no está funcionando como se esperaba.¿Cómo uso PackageManager.addPreferredActivity()?

Algunos antecedentes necesarios. Estoy escribiendo una aplicación de reemplazo de la pantalla de bloqueo, por lo que quiero que la tecla de inicio inicie mi aplicación (que ya se ejecutará y, por lo tanto, tendrá el efecto de desactivarla). Cuando el usuario "desbloquea" la pantalla, intento restablecer la asignación para que todo funcione de la forma habitual.

En mi AndroidManifest.xml que tengo:

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

En mi código tengo el siguiente fragmento:

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

El comportamiento resultante es que el selector de aplicación aparece cuando pulso el hogar clave, que indica que la llamada clearPackagePreferredActivities() funcionó, pero mi aplicación no se agregó como la preferida. Además, la primera línea del registro de abajo dice algo acerca de "dejar caer la actividad preferida para Intención":

04-06 02: 34: 42.379: INFO/PackageManager (1017): Conjunto de resultados cambió, dejando caer la actividad preferida para Intención {act = android.intent.action.MAIN cat = [android.intent.category.HOME] flg = 0x10200000} escriba null

04-06 02: 34: 42.379: INFO/ActivityManager (1017): Actividad de inicio : Intención {act = android.intent.action.MAIN cat = [android.intent.category.HOME] flg = 0x10200000 cmp = androide/com.android.internal.app.ResolverActivity}

Do ¿Alguien sabe qué significa este primer mensaje de registro? Tal vez no estoy usando la API correctamente, ¿alguna idea? Cualquier ayuda sería muy apreciada.

+0

Gran detalle de la pregunta. Espero que tengas tu respuesta. Bienvenido a Stack Overflow. –

Respuesta

11

@afonseca: Estaba lidiando con el mismo problema. Gracias por el código, lo usé para empezar. También gracias Shimon. Fundí su respuesta en la mía. Tengo el código funcionando (en 1.6 y 2.1 actualización 1). Se ha ajustado un poco, pero los 2 cambios principales parecen ser la sugerencia de Shimons y: ".Launcher" se cambió a "com.android.launcher.Launcher". El código de trabajo se publica a continuación.

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: para obtener dinámicamente la lista de aplicaciones de inicio instaladas, es posible que desee comenzar en PackageManager.queryIntentActivities (android.content.Intent, int). Buena suerte, a2ronus. – a2ronus

+0

Gracias a ambos, excelente respuesta. Desearía que hubiera más ejemplos en los documentos de Android para empezar. – afonseca

+0

Gracias Matt y a2ronus. Muy útil. –

2

Esto parece funcionar para mí si inicializar la matriz components a ALL HOME aplicaciones en el dispositivo:

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

Mi problema es cómo puedo rellenar esta dinámica.

1

addPreferredActivity ya no funciona en 2.2, clearPackagePreferredActivities todavía funciona, pero sólo se puede clara preferencia por el paquete se ejecuta en este.

Hay muchos hilos en los grupos de android google sobre este problema y la posición oficial de Google (por ahora) de no proporcionarle métodos para sobrepasar las preferencias del usuario.

4

Esta respuesta puede llegar un poco tarde pero dice API Docs para clearPackagePreferredActivities:

Una aplicación sólo puede clara su propio paquete (s).

Por lo tanto, yo creo que en "restaurar el mapeo" el único que puede hacer es algo como:

getPackageManager().clearPackagePreferredActivities(getPackageName()); 

y así despejar el ajuste por defecto para la pantalla HOME.

+0

Esto realmente funciona. – AB1209