Pregunta

durante algún requisito específico Estoy obligado a cambiar la aplicación de inicio por defecto de Android con mi solicitud de inicio personalizada (un ajuste dentro de mi aplicación que se alternará de inicio por defecto = mi solicitud o en el hogar anterior)

No quiero que el usuario pueda viajar configuración de Android que son muy complicados.

Puede alguien me ayude a cabo como en los que se registra launcher.apk por defecto aplicación casa o cómo cambiar eso

Lo único que pude encontrar fue que vieja pregunta: Cómo cambiar por defecto aplicación de escritorio de Android?

pero no hay respuestas a todos.

He visto HomeSwitcher en el mercado que hacen el truco, pero no hubo respuesta para el desarrollador que sin duda podría ser ocupado.

Editar

He encontrado esto en la web http: // www .mail-archive.com / android-desarrolladores @ googlegroups.com / 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 conjunto en el android.permission.SET_PREFERRED_APPLICATIONS manifiesto. Después de ejecutar el código anterior, los registros de reclamar cosas tienen ha agregado como esperados (mismos registros como cuando marcar la casilla "Establecer como predeterminado" de la lista de IntentResolver). Sin embargo, cuando procedo por hogar clic, la lista sigue apareciendo y los registros de decir:

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

Por lo que parece el sistema de resolución elimina la entrada por defecto. Estoy haciendo algo mal, o se trata de una medida de seguridad? ¿Cuáles son las ideas detrás de esto?

¿Fue útil?

Solución

Hice una extensa investigación sobre la que, partiendo de 2.2 no hay manera de hacerlo. La única forma es utilizar un poco de hacking que la aplicación de bloqueo de niño lo hace, pero esta aplicación pone teléfonos Samsung recientemente en el bucle infinito, por lo que es un enfoque de riesgo.

Si nos fijamos en el código fuente Froyo aquí de clase PackageManager, verá este pequeño estado 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 desarrollador hizo un comentario en la página de aplicaciones " Froyo (2.2) no es compatible debido al cambio de API "

Otros consejos

"Conjunto de resultados modificados" significa que el conjunto de paquetes que coincidan con la intención de que ha cambiado a partir del conjunto que ha especificado al crear el defecto - - lo que el defecto ya no es válida. Su lista de componentes (la que está estableciendo actualmente en null) debe contener aplicaciones presentes en el dispositivo de pantalla de inicio de todo, no sólo la suya.

A continuación del código de ejemplo que he probado (usando adb shell de la mañana se inicia http://www.google.co. uk / ) y se utiliza para configurar el navegador por defecto. XXX representa un nombre de cliente que tenía que fuera negro.

Tenga en cuenta que con el fin de llamar addPreferredActivity debe haber compilado con una versión mínima del SDK-8 (2.2) y debe haber especificado el permiso SET_PREFERRED_APPLICATIONS. Que el permiso es el nivel de protección 2, por lo que deberá ser firmado con el mismo certificado como 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 hacia abajo, podría usted, hágamelo saber por qué. El código que he publicado anteriormente se ha probado y funciona ...

startActivity(new Intent(Settings.ACTION_HOME_SETTINGS));

Este código funciona en mi dispositivo ICS: Yo uso un servicio que es sensible a algunos llaman, uno de ellos se llama SET_PREFERRED_LAUNCHER, la opción de venta en un paquete el paquete nuevo valor predeterminado Launcher (PREFERRED_PACKAGE_KEY) y de la 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 que añadir en el 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);
}

donde:

    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;
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top