Android: cambiar la aplicación predeterminada de inicio

Para algún requisito específico estoy obligado a cambiar la aplicación de inicio predeterminado de Android con mi aplicación de inicio personalizada (un ajuste dentro de mi aplicación que cambiará por defecto home = mi aplicación o casa anterior)

No quiero que el usuario viaje los ajustes de Android que son muy complicados.

¿Puede alguien ayudarme como dónde se registra launcher.apk para la aplicación de inicio por defecto o cómo cambiar eso

Lo único que pude encontrar fue esa vieja pregunta: ¿Cómo cambiar la aplicación predeterminada de Android?

Pero no hay respuestas en absoluto.

He visto HomeSwitcher en el mercado que hacer el truco, pero no hay respuesta para el desarrollador que sin duda podría estar ocupado.

EDITAR

Encontré esto en la web http://www.mail-archive.com/[email protected]/msg74167.html

Pero tengo el mismo problema:

Este es mi código

private void makePreferred() { PackageManager pm = getPackageManager(); IntentFilter f = new IntentFilter("android.intent.action.MAIN"); f.addCategory("android.intent.category.HOME"); f.addCategory("android.intent.category.DEFAULT"); ComponentName cn = new ComponentName("com.example.android.home", "com.example.android.home.Home"); pm.addPreferredActivity(f, IntentFilter.MATCH_CATEGORY_EMPTY, null, cn); 

Tengo el android.permission.SET_PREFERRED_APPLICATIONS establecido en el manifiesto. Después de ejecutar el código anterior, los registros indican que las cosas se han agregado como se esperaba (los mismos registros que cuando marca la opción "Hacer predeterminado" de la lista de IntentResolver). Sin embargo, cuando procedo haciendo clic en mi casa, la lista sigue apareciendo y los registros dicen:

 INFO/PackageManager(52): Result set changed, dropping preferred activity for Intent { act=android.intent.action.MAIN cat= [android.intent.category.HOME] flg=0x10200000 } type null 

Así que parece que el resolvedor elimina la entrada predeterminada. ¿Estoy haciendo algo mal, o es una medida de seguridad? ¿Cuáles son las ideas detrás de esto?

Hice una investigación extensa en eso ya partir de 2.2 no hay manera de hacer eso. La única manera es usar un poco de hacking que la aplicación de bloqueo niño, pero esta aplicación puso teléfonos samsung recientemente en el bucle infinito, por lo que es un enfoque de riesgo.

Si observa el código fuente froyo aquí de la clase packagemanager, verá esta pequeña condición en el método addPreferredActivity:

 if (getUidTargetSdkVersionLockedLP(Binder.getCallingUid()) < Build.VERSION_CODES.FROYO) { Slog.w(TAG, "Ignoring addPreferredActivity() from uid" + Binder.getCallingUid()); return; } 

HomeSwitcher no funciona correctamente en 2.2 ya que utiliza este mismo método y el desarrollador hizo un comentario en la página de la aplicación " Froyo (2.2) no es compatible debido al cambio de API "

"Conjunto de resultados cambiado" significa que el conjunto de paquetes que coinciden con esa intención ha cambiado del conjunto que especificó al crear el valor predeterminado – – por lo que el valor predeterminado ya no es válido. Su lista de componentes (que está configurando actualmente a null) debe contener todas las aplicaciones de pantalla de inicio presentes en el dispositivo, no sólo la suya.

He aquí un ejemplo de código que he probado (usando adb shell am start http://www.google.co.uk/ ) y que se utiliza para establecer el navegador predeterminado. XXX representa un nombre de cliente que tuve que borrar.

Tenga en cuenta que para llamar a addPreferredActivity debe haber compilado contra una versión mínima de sdk de 8 (2.2) y debe haber especificado el permiso SET_PREFERRED_APPLICATIONS. Ese permiso es nivel de protección 2, por lo que necesita estar firmado con el mismo certificado que PackageManager.

 IntentFilter filter = new IntentFilter(); filter.addAction("android.intent.action.VIEW"); filter.addCategory("android.intent.category.DEFAULT"); filter.addDataScheme("http"); Context context = getApplicationContext(); ComponentName component = new ComponentName("com.opera.mini.XXX", "com.opera.mini.XXX.CustomerBrowser"); ComponentName[] components = new ComponentName[] {new ComponentName("com.android.browser", "com.android.browser.BrowserActivity"), component}; pm.addPreferredActivity(filter, IntentFilter.MATCH_CATEGORY_SCHEME, components, component); 

ETA – si marcó esta respuesta, podría decirme por qué. El código que posteé anteriormente está probado y funciona …

Este código funciona en mi dispositivo ICS: Yo uso un servicio que es sensible a algunas llamadas, una de ellas se llama SET_PREFERRED_LAUNCHER, pone en un paquete su nuevo paquete de lanzador predeterminado (PREFERRED_PACKAGE_KEY) y su actividad (PREFERRED_ACTIVITY_KEY)

 Method installPackageMethod = null; Method deletePackageMethod = null; Method setPreferredActivityMethod = null; Method replacePreferredActivityMethod = null; Object pm = null; @Override public void onCreate() { super.onCreate(); if (pm == null) pm = getPackageManager(); try { if (setPreferredActivityMethod == null) setPreferredActivityMethod = pm.getClass().getMethod( "addPreferredActivity", IntentFilter.class, int.class, ComponentName[].class, ComponentName.class); } catch (NoSuchMethodException e) { e.printStackTrace(); } } private final class ServiceHandler extends Handler { private Context context; public ServiceHandler(Looper looper, Context ctx) { super(looper); context = ctx; } @Override public void handleMessage(Message msg) { Intent intent = (Intent) msg.getData().getParcelable( UPDATER_SERVICE_ACTION); int request = intent.getIntExtra( REQUEST_KEY, REQUEST_UNKNOWN); Bundle bundle = intent.getExtras(); switch (request) { case INSTALL_APPLICATION: { if (bundle != null) { String appPath = bundle .getString(APP_PATH_KEY); if (appPath != null) { LogUtil.e(TAG, "try to install " + appPath); try { am.installPackage(appPath); } catch (Exception e) { e.printStackTrace(); } LogUtil.e(TAG, "install of " + appPath + " done"); } } break; } case UNISTALL_PACKAGE: { if (bundle != null) { String packagename = bundle .getString(PACKAGE_NAME_KEY); if (packagename != null) { LogUtil.e(TAG, "unistall " + packagename); try { deletePackageMethod .invoke(pm, packagename, null, 0); } catch (Exception e) { e.printStackTrace(); } } } break; } case SET_PREFERRED_LAUNCHER: { if (bundle != null) { String package_name = bundle .getString(PREFERRED_PACKAGE_KEY); if (package_name == null) { LogUtil.e(TAG, "WARNING: setDefaultActivity cannot continue, package is NULL"); return; } String activity_name = bundle .getString(PREFERRED_ACTIVITY_KEY); if (activity_name == null) { LogUtil.e(TAG, "WARNING: setDefaultActivity cannot continue, activity is NULL"); return; } LogUtil.e(TAG, "setDefaultActivity activity=" + activity_name + " package=" + package_name); 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", "com.android.launcher2.Launcher"), new ComponentName(package_name, activity_name) }; ComponentName activity = new ComponentName(package_name, activity_name); try { setPreferredActivityMethod.invoke(pm, filter, IntentFilter.MATCH_CATEGORY_EMPTY, components, activity); } catch (Exception e) { e.printStackTrace(); } } } } } } 

Recuerde agregar en su archivo de manifiesto este permiso:

  <uses-permission android:name="android.permission.SET_PREFERRED_APPLICATIONS"/> 

Uso:

  public void setPreferredLauncher(String activity_name,String package_name) { Intent intent = new Intent(UPDATER_SERVICE_ACTION); intent.putExtra(REQUEST_KEY, SET_PREFERRED_LAUNCHER); intent.putExtra(PREFERRED_ACTIVITY_KEY, activity_name); intent.putExtra(PREFERRED_PACKAGE_KEY, package_name); context.startService(intent); } 

dónde:

  public static final String _UPDATER_SERVICE_ACTION = "com.android.updaterservice.ACTION"; public static final String REQUEST_KEY = "com.android.updaterservice.REQUEST_KEY"; public static final String PACKAGE_NAME_KEY = "com.android.updaterservice.PACKAGE_NAME_KEY"; public static final String APP_PATH_KEY = "com.android.updaterservice.APP_PATH_KEY"; public static final String PREFERRED_ACTIVITY_KEY = "com.android.updaterservice.PREFERRED_ACTIVITY_KEY"; public static final String PREFERRED_PACKAGE_KEY = "com.android.updaterservice.PREFERRED_PACKAGE_KEY"; public static final String INSTALL_PACKAGE_RESULT = "com.android.updaterservice.INSTALL_PACKAGE_RESULT"; public static final String PACKAGE_NAME = "PACKAGE_NAME"; public static final String INSTALL_SUCCEEDED = "INSTALL_SUCCEEDED"; public static final int REQUEST_UNKNOWN = -1; public static final int INSTALL_APPLICATION = 1; public static final int UNISTALL_PACKAGE = 2; public static final int SET_PREFERRED_LAUNCHER = 3; 
 startActivity(new Intent(Settings.ACTION_HOME_SETTINGS)); 
FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.