Question

pour une exigence spécifique Je suis obligé de modifier l'application par défaut Accueil Android avec mon application Home personnalisée (un réglage dans mon application qui permet de basculer la maison par défaut = ma demande ou à la maison précédente)

Je ne veux pas l'utilisateur de se déplacer les paramètres Android qui sont très complexes.

Quelqu'un peut-il une aide-moi sortir comme où il enregistre launcher.apk par défaut application à la maison ou comment changer cela

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

mais pas de réponse du tout.

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

EDIT

J'ai trouvé sur le web http: // www .mail-archive.com / android-développeurs @ googlegroups.com / msg74167.html

Mais je suis le même problème:

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

Je l'ensemble de android.permission.SET_PREFERRED_APPLICATIONS dans la manifeste. Après l'exécution du code ci-dessus, les journaux ont des choses réclamer été ajoutée comme prévu (même que les journaux quand je cocher « Définir par défaut » de la liste IntentResolver). Cependant, quand je passe par la maison de clic, la liste montre encore et dire les journaux:

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 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 tout cela?

Était-ce utile?

La solution

Je l'ai fait une recherche approfondie sur cette question et à partir de 2.2 il n'y a aucun moyen de le faire. La seule façon utilise une application de piratage informatique de verrouillage enfant en bas âge fait, mais cette application a mis les téléphones Samsung récemment dans la boucle infinie, il est donc une approche risquée.

si vous regardez le code source froyo ici de 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 2.2 car il utilise cette méthode même et développeur a fait un commentaire sur la page de l'application « Froyo (2.2) est pas pris en charge en raison du changement d'API "

Autres conseils

« jeu de résultats changé » signifie que l'ensemble des paquets correspondant à cette intention a changé de l'ensemble que vous avez spécifié lors de la création par défaut - - de sorte que le défaut n'est plus valide. Votre liste des composants (qui vous met actuellement à null) doit contenir toutes les applications présentes sur l'écran d'accueil appareil, pas seulement le vôtre.

Le code exemple de là que je l'ai testé (en utilisant adb am shell démarrer http://www.google.co. Royaume-Uni / ) et utilisé pour définir le navigateur par défaut. XXX représente un nom de client que je devais en noir.

Notez que pour appeler addPreferredActivity vous devez avoir compilé avec une version minimale sdk de 8 (2.2) et vous devez avoir spécifié l'autorisation de SET_PREFERRED_APPLICATIONS. Cette autorisation est le niveau de protection 2, 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 avez marqué cette réponse vers le bas, pourriez-vous me faire savoir pourquoi. Le code ci-dessus est que j'ai posté testé et fonctionnel ...

startActivity(new Intent(Settings.ACTION_HOME_SETTINGS));

Ce code fonctionne sur mon appareil ICS: J'utilise un service qui est raisonnable à un certain appel, l'un d'eux est appelé SET_PREFERRED_LAUNCHER, la mettre dans un paquet de 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();
                }
            }
        }
        }

    }

}

Souvenez-vous d'ajouter dans votre fichier manifeste cette autorisation:

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

Utilisation:

    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;
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top