android changer - Comment définir le lanceur d'application par défaut par programmation?




programme que (4)

Je crée une application de lanceur (kiosque) qui sera téléchargeable via google. Lors de la première installation de cette application, l'utilisateur a la possibilité de choisir le lanceur par défaut (le mien ou le stock). J'essaie de le faire manuellement si l'utilisateur ne fait pas de mon application le lanceur par défaut. Je veux que l'utilisateur soit forcé de sélectionner TOUJOURS au lieu de JUST ONCE lorsque cette boîte de dialogue apparaît, sinon la boîte de dialogue continuera à apparaître périodiquement avec un message convivial. C'est ce que j'ai essayé jusqu'ici.

J'ai créé une méthode pour vérifier si mon application est la valeur par défaut

/**
 * method checks to see if app is currently set as default launcher
 * @return boolean true means currently set as default, otherwise false
 */ 
private boolean isMyAppLauncherDefault() {
    final IntentFilter filter = new IntentFilter(Intent.ACTION_MAIN);
    filter.addCategory(Intent.CATEGORY_HOME);

    List<IntentFilter> filters = new ArrayList<IntentFilter>();
    filters.add(filter);

    final String myPackageName = getPackageName();
    List<ComponentName> activities = new ArrayList<ComponentName>();
    final PackageManager packageManager = (PackageManager) getPackageManager();

    packageManager.getPreferredActivities(filters, activities, null);

    for (ComponentName activity : activities) {
        if (myPackageName.equals(activity.getPackageName())) {
            return true;
        }
    }
    return false;
}   

Alors je fais la tentative de lancer le sélecteur

/**
 * method starts an intent that will bring up a prompt for the user
 * to select their default launcher. It comes up each time it is
 * detected that our app is not the default launcher
 */
private void launchAppChooser() {
    Log.d(TAG, "launchAppChooser()");
    Intent intent = new Intent(Intent.ACTION_MAIN);
    intent.addCategory(Intent.CATEGORY_HOME);
    intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    startActivity(intent);
}

Lorsque je fais cela, je ne reçois pas le choix entre mon application et le lanceur de stock. J'ai essayé d'utiliser startActivity(Intent.createChooser(intent, "Please set launcher settings to ALWAYS")); et j'obtiens les choix entre mon application et le lanceur d'actions, cependant, je n'obtiens pas toujours les options TOUJOURS ou JUST.

Je peux créer une boîte de dialogue personnalisée pour cela au lieu de lancer le sélecteur, mais je dois savoir comment configurer le lanceur d'applications par défaut par programmation. Merci d'avance!


Answers

C'est effectivement possible avec une petite solution de contournement:

Créez une Activity vide faisant office de lanceur appelé FakeLauncherActivity . Ajoutez-le à votre manifeste en tant que composant désactivé :

<activity
    android:name="com.path.to.your.FakeLauncherActivity"
    android:enabled="false">
    <intent-filter>
        <action android:name="android.intent.action.MAIN" />

        <category android:name="android.intent.category.HOME" />
        <category android:name="android.intent.category.DEFAULT" />
    </intent-filter>
</activity>

Vérifiez si votre activité de lancement souhaitée est celle par défaut (avec isMyAppLauncherDefault() de votre question).

Si ce n'est pas le cas, proposez à l'utilisateur de choisir l'activité de lanceur préférée comme ceci:

public static void resetPreferredLauncherAndOpenChooser(Context context) {
    PackageManager packageManager = context.getPackageManager();
    ComponentName componentName = new ComponentName(context, com.path.to.your.FakeLauncherActivity.class);
    packageManager.setComponentEnabledSetting(componentName, PackageManager.COMPONENT_ENABLED_STATE_ENABLED, PackageManager.DONT_KILL_APP);

    Intent selector = new Intent(Intent.ACTION_MAIN);
    selector.addCategory(Intent.CATEGORY_HOME);
    selector.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    context.startActivity(selector);

    packageManager.setComponentEnabledSetting(componentName, PackageManager.COMPONENT_ENABLED_STATE_DEFAULT, PackageManager.DONT_KILL_APP);
}

Cette méthode active temporairement FakeLauncherActivity , ce qui entraîne une modification de l'ensemble des activités de lancement disponibles, ce qui oblige Android à oublier son lanceur par défaut. Vous verrez quelque chose comme ...

521-735/system_process I/PackageManager﹕ Result set changed, dropping preferred activity for Intent { act=android.intent.action.MAIN cat=[android.intent.category.HOME] flg=0x10000000 } type null

... dans votre journal.

La méthode ouvre alors simplement une intention de lancement où vous pouvez voir tous les lanceurs installés et les boutons "Toujours" / "Juste une fois". Enfin, la méthode désactive à nouveau FakeLauncherActivity pour qu'elle ne s'affiche pas dans la liste.

Vous pouvez répéter cette opération aussi souvent que vous le souhaitez et laisser l’utilisateur continuer uniquement si l’activité de lancement souhaitée est définie par défaut.


Je veux que l'utilisateur soit forcé de sélectionner TOUJOURS au lieu de JUST ONCE lorsque cette boîte de dialogue apparaît

Ce n’est pas possible, sauf peut-être sur les appareils enracinés, sauf en cas de faille de sécurité dans Android.

Quand je fais ceci je ne reçois pas le choix entre mon application et le lanceur de stock

Correct. Si une valeur par défaut a déjà été choisie, cela lancera simplement la valeur par défaut.

J'ai essayé d'utiliser startActivity (Intent.createChooser (intention, "Veuillez définir les paramètres du lanceur sur TOUJOURS")); et j'obtiens les choix entre mon application et le lanceur d'actions, cependant, je n'obtiens pas toujours les options TOUJOURS ou JUST.

Correct. createChooser() force un choix, mais ne permet pas de définir une valeur par défaut.


La fonction isMyAppLauncherDefault () dans la question ne fonctionne pas toujours pour une raison quelconque. Ce code peut être préférable pour déterminer quel est le package par défaut pour l'écran HOME.

Intent intent = new Intent(Intent.ACTION_MAIN);
intent.addCategory(Intent.CATEGORY_HOME);
ResolveInfo resolveInfo = getPackageManager().resolveActivity(intent, PackageManager.MATCH_DEFAULT_ONLY);
String currentHomePackage = resolveInfo.activityInfo.packageName;

Passez l'option pour simplement décoder les limites à l'usine:

BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = true;

//Returns null, sizes are in the options variable
BitmapFactory.decodeFile("/sdcard/image.png", options);
int width = options.outWidth;
int height = options.outHeight;
//If you want, the MIME type will also be decoded (if possible)
String type = options.outMimeType;

HTH





android android-intent launcher