web-dev-qa-db-fra.com

Android: modifier l'application d'accueil par défaut

pour certaines exigences spécifiques je dois modifier l'application Android Default Home avec mon application d'accueil personnalisée (paramètre de mon application permettant d'activer/de désactiver l'accueil par défaut = mon application ou mon ancien logement)

Je ne veux pas que l'utilisateur se déplace des paramètres Android qui sont très compliqués.

Quelqu'un peut-il m'aider comme où il enregistre launcher.apk pour l'application à domicile Par défaut ou comment le modifier?

La seule chose que je pouvais trouver était cette vieille question: Comment changer l'application de bureau par défaut d'Android?

mais pas de réponse du tout.

J'ai vu HomeSwitcher sur le marché faire l'affaire, mais pas de réponse pour le développeur qui pourrait certainement être occupé.

EDIT

J'ai trouvé ceci sur le Web http://www.mail-archive.com/[email protected]/msg74167.html

Mais j'ai le même problème:

c'est mon code:

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

J'ai le Android.permission.SET_PREFERRED_APPLICATIONS défini dans le manifeste . Après avoir exécuté le code ci-dessus, les journaux affirment que des éléments ont été ajoutés Comme prévu (les mêmes journaux que lorsque j'ai coché la case "Définir par défaut" Dans la liste de IntentResolver). Cependant, lorsque je clique sur le bouton home, S'affiche toujours et les journaux indiquent:

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

Il semble donc que le résolveur supprime l’entrée par défaut. Est-ce que je fais quelque chose de mal Ou est-ce une mesure de sécurité? Quelles sont les idées Derrière cela?

23
Waza_Be

J'ai fait une recherche approfondie à ce sujet et à partir de la version 2.2, il n'y a aucun moyen de le faire. La seule façon d'utiliser un peu de piratage que cette application de verrouillage pour tout-petit fait, mais cette application place les téléphones Samsung récemment dans la boucle infinie; il s'agit donc d'une approche risquée.

si vous regardez le code source de froyo ici de la classe packagemanager, vous verrez cette petite condition dans la méthode addPreferredActivity:

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

HomeSwitcher ne fonctionne pas correctement sur la version 2.2, car il utilise cette méthode et le développeur a fait un commentaire sur la page de l'application " Froyo (2.2) n'est pas pris en charge En raison de la modification de l'API ".

8
mishkin

"Ensemble de résultats modifié" signifie que l'ensemble de packages correspondant à cette intention a été modifié par rapport à l'ensemble que vous avez spécifié lors de la création de la valeur par défaut - -. Par conséquent, la valeur par défaut n'est plus valide. Votre liste de composants (que vous définissez actuellement sur null) doit contenir toutes les applications d'écran d'accueil présentes sur l'appareil, pas seulement les vôtres.

Voici un exemple de code que j'ai testé (avec adb Shell am start http://www.google.co.uk/ ) et utilisé pour définir le navigateur par défaut. XXX représente un nom de client que j'ai dû occulter. 

Notez que pour appeler addPreferredActivity, vous devez avoir compilé avec une version minimale-sdk de 8 (2.2) et avoir spécifié l’autorisation SET_PREFERRED_APPLICATIONS. Cette autorisation a le niveau de protection 2 et vous devez donc être signé avec le même certificat 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 vous notez cette réponse, pourriez-vous me dire pourquoi. Le code que j'ai posté ci-dessus est testé et fonctionne ...

7
Airsource Ltd

Ce code fonctionne sur mon périphérique ICS: j'utilise un service sensible à un appel. L'un d'entre eux s'appelle SET_PREFERRED_LAUNCHER, il met dans un paquet votre nouveau package de lancement par défaut (PREFERRED_PACKAGE_KEY) et son activité (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();
                }
            }
        }
        }

    }

}

N'oubliez pas d'ajouter dans votre fichier manifeste cette autorisation: 

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

Usage:

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

où:

    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;
0
Andrea Budelacci
startActivity(new Intent(Settings.ACTION_HOME_SETTINGS));
0
Oded Breiner