predeterminado - Android: cambiar la aplicación de inicio predeterminada
desinstalar launcher por defecto (4)
para algún requisito específico, debo cambiar la aplicación de Inicio predeterminado de Android con mi aplicación de Inicio personalizada (una configuración dentro de mi aplicación que alternará entre inicio = mi aplicación o inicio anterior)
No quiero que el usuario viaje configuraciones de Android que son muy complicadas.
¿Puede alguien ayudarme como dónde registra launcher.apk para la aplicación doméstica predeterminada o cómo cambiar eso?
Lo único que pude encontrar fue la vieja pregunta: ¿Cómo cambiar la aplicación de escritorio predeterminada de Android?
pero no hay respuestas en absoluto.
He visto a HomeSwitcher in the Market que hace el truco, pero no hay una respuesta para el desarrollador que pueda estar realmente ocupada.
EDITAR
Encontré esto en la web http://www.mail-archive.com/[email protected]/msg74167.html
Pero tengo el mismo problema:
este es mi codigo
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 afirman que las cosas se agregaron como se esperaba (los mismos registros que cuando selecciono "Establecer como predeterminado" en la lista de IntentResolver). Sin embargo, cuando hago clic en Inicio, 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 borra la entrada por defecto. ¿Estoy haciendo algo mal o es una medida de seguridad? ¿Cuáles son las ideas detrás de esto?
"Conjunto de resultados cambiado" significa que el conjunto de paquetes que coinciden con esa intención ha cambiado con respecto al conjunto que especificó cuando creó el valor predeterminado, por lo que el valor predeterminado ya no es válido. Su lista de componentes (que actualmente está configurando como nulo) debe contener todas las aplicaciones de pantalla de inicio presentes en el dispositivo, no solo la suya.
Este es un código de ejemplo que he probado (usando adb shell am start http://www.google.co.uk/ ) y que se utiliza para configurar el navegador predeterminado. XXX representa un nombre de cliente que tuve que bloquear.
Tenga en cuenta que para llamar a addPreferredActivity debe haber compilado una versión de sdk mínimo de 8 (2.2) y debe haber especificado el permiso SET_PREFERRED_APPLICATIONS. Ese permiso es el nivel de protección 2, por lo que debe estar firmado con el mismo certificado que el 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 publiqué arriba está probado y funcionando ...
Este código funciona en mi dispositivo ICS: utilizo un servicio que es adecuado para algunas llamadas, uno de ellos se llama SET_PREFERRED_LAUNCHER, el paquete de su nuevo programa de inicio 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();
}
}
}
}
}
}
Recuerda agregar en tu archivo 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;
Hice una extensa investigación sobre eso y, a partir de la versión 2.2, no hay forma de hacerlo. La única forma es usar un poco de pirateo que hace la aplicación de bloqueo para niños pequeños, pero esta aplicación puso a los teléfonos de Samsung recientemente en el bucle infinito, por lo que es un enfoque riesgoso.
Si observa el código fuente de froyo here 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 la versión 2.2, ya que utiliza este mismo método y el desarrollador realizó un comentario en la página de la aplicación " Froyo (2.2) no es compatible debido al cambio de API "
startActivity(new Intent(Settings.ACTION_HOME_SETTINGS));