web-dev-qa-db-fra.com

Android crée des raccourcis sur l'écran d'accueil

Ce que je veux faire c'est: 

1) Je suis dans une activité, il y a 2 boutons. Si je clique sur le premier, un raccourci est créé dans mon écran d’accueil. Le raccourci ouvre une page html qui a été précédemment téléchargée. Par conséquent, je souhaite utiliser le navigateur par défaut, mais je ne souhaite pas utiliser Internet, car cette page existe déjà.

2) Le deuxième bouton crée un autre raccourci qui démarre une activité. Et je veux transmettre à l'activité des arguments supplémentaires (comme des chaînes par exemple) ...........

Est-ce que ces choses sont possibles? J'ai trouvé des liens et des questions similaires, telles que Android: Existe-t-il un moyen de créer un raccourci Web sur l'écran d'accueil

Ils semblent être la réponse à ma question mais quelqu'un m'a dit que ce code ne fonctionnerait pas sur tous les appareils et qu'il est obsolète et que ce que je veux faire n'est pas possible .......

Cette technique n'est pas recommandée. Il s'agit d'une implémentation interne, ne faisant pas partie du SDK Android. Cela ne fonctionnera pas avec toutes les implémentations de l'écran d'accueil. Il se peut que cela ne fonctionne pas sur toutes les versions antérieures d'Android. Il est possible que cela ne fonctionne pas dans les futures versions d'Android, car Google n'est pas obligé de conserver des interfaces internes non documentées. S'il vous plaît ne pas utiliser cette

Que signifie implémentation interne? Ce code est-il fiable ou non ..... aidez-moi svp .....

54
Sgotenks

L'exemple de code utilise des interfaces non documentées (permission et intention) pour installer un raccourci. Comme "quelqu'un" vous l'a dit, il se peut que cela ne fonctionne pas sur tous les téléphones et risque de ne plus fonctionner correctement dans les versions futures d'Android. Ne le fais pas.

La bonne façon consiste à écouter une demande de raccourci à partir de l'écran d'accueil - avec un filtre d'intention comme dans votre manifeste:

<activity Android:name=".ShortCutActivity" Android:label="@string/shortcut_label">
  <intent-filter>
    <action Android:name="Android.intent.action.CREATE_SHORTCUT" />
    <category Android:name="Android.intent.category.DEFAULT" />
  </intent-filter>
</activity>

Ensuite, dans l'activité qui reçoit l'intention, vous créez une intention pour votre raccourci et la retournez comme résultat de l'activité.

// create shortcut if requested
ShortcutIconResource icon =
    Intent.ShortcutIconResource.fromContext(this, R.drawable.icon);

Intent intent = new Intent();

Intent launchIntent = new Intent(this,ActivityToLaunch.class);

intent.putExtra(Intent.EXTRA_SHORTCUT_INTENT, launchIntent);
intent.putExtra(Intent.EXTRA_SHORTCUT_NAME, someNickname());
intent.putExtra(Intent.EXTRA_SHORTCUT_ICON_RESOURCE, icon);

setResult(RESULT_OK, intent);
82
antlersoft

J'ai développé une méthode ci-dessous pour créer l'icône de raccourci sur l'écran d'accueil Android [testé sur ma propre application]. Appelez-le.

private void ShortcutIcon(){

    Intent shortcutIntent = new Intent(getApplicationContext(), MainActivity.class);
    shortcutIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    shortcutIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);

    Intent addIntent = new Intent();
    addIntent.putExtra(Intent.EXTRA_SHORTCUT_INTENT, shortcutIntent);
    addIntent.putExtra(Intent.EXTRA_SHORTCUT_NAME, "Test");
    addIntent.putExtra(Intent.EXTRA_SHORTCUT_ICON_RESOURCE, Intent.ShortcutIconResource.fromContext(getApplicationContext(), R.drawable.ic_launcher));
    addIntent.setAction("com.Android.launcher.action.INSTALL_SHORTCUT");
    getApplicationContext().sendBroadcast(addIntent);
}

N'oubliez pas de changer le nom de votre activité, votre ressource d'icône et votre permission.

<uses-permission Android:name="com.Android.launcher.permission.INSTALL_SHORTCUT" />

Bonne codage !!!

Modifier:

Pour les doublons, la première option consiste à ajouter la ligne ci-dessous dans le code, sinon elle en crée une nouvelle à chaque fois. 

addIntent.putExtra("duplicate", false);

La deuxième option consiste à désinstaller d'abord l'icône de raccourci d'application, puis à l'installer à nouveau si la première option n'a pas fonctionné.

65
Siddiq Abu Bakkar

J'ai amélioré un peu une solution ci-dessus. Maintenant, il enregistre dans les préférences si un raccourci a déjà été ajouté et ne l'ajoute pas dans les nouveaux lancements d'application si l'utilisateur le supprime. Cela permet également de gagner un peu de temps, car le code pour ajouter un raccourci existant ne s'exécute plus. 

final static public String PREFS_NAME = "PREFS_NAME";
final static private String PREF_KEY_SHORTCUT_ADDED = "PREF_KEY_SHORTCUT_ADDED";


// Creates shortcut on Android widget screen
private void createShortcutIcon(){

    // Checking if ShortCut was already added
    SharedPreferences sharedPreferences = getPreferences(MODE_PRIVATE);
    boolean shortCutWasAlreadyAdded = sharedPreferences.getBoolean(PREF_KEY_SHORTCUT_ADDED, false);
    if (shortCutWasAlreadyAdded) return;

    Intent shortcutIntent = new Intent(getApplicationContext(), IntroActivity.class);
    shortcutIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    shortcutIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);

    Intent addIntent = new Intent();
    addIntent.putExtra(Intent.EXTRA_SHORTCUT_INTENT, shortcutIntent);
    addIntent.putExtra(Intent.EXTRA_SHORTCUT_NAME, "YourAppName");
    addIntent.putExtra(Intent.EXTRA_SHORTCUT_ICON_RESOURCE, Intent.ShortcutIconResource.fromContext(getApplicationContext(), R.drawable.ic_launcher));
    addIntent.setAction("com.Android.launcher.action.INSTALL_SHORTCUT");
    getApplicationContext().sendBroadcast(addIntent);

    // Remembering that ShortCut was already added
    SharedPreferences.Editor editor = sharedPreferences.edit();
    editor.putBoolean(PREF_KEY_SHORTCUT_ADDED, true);
    editor.commit();
}
8
wzbozon

La diffusion com.Android.launcher.action.INSTALL_SHORTCUT n'a plus d'effet depuis Android oreo. LIEN

Si vous souhaitez prendre en charge toutes les versions d'Android, en particulier Android 8.0 ou oreo et plus récent, utilisez le code ci-dessous pour créer un raccourci:

public static void addShortcutToHomeScreen(Context context)
{
    if (ShortcutManagerCompat.isRequestPinShortcutSupported(context))
    {
        ShortcutInfoCompat shortcutInfo = new ShortcutInfoCompat.Builder(context, "#1")
                .setIntent(new Intent(context, YourActivity.class).setAction(Intent.ACTION_MAIN)) // !!! intent's action must be set on oreo
                .setShortLabel("Test")
                .setIcon(IconCompat.createWithResource(context, R.drawable.ic_launcher))
                .build();
        ShortcutManagerCompat.requestPinShortcut(context, shortcutInfo, null);
    }
    else
    {
        // Shortcut is not supported by your launcher
    }
}

Ajouter une autorisation dans le fichier manifeste:

<uses-permission Android:name="com.Android.launcher.permission.INSTALL_SHORTCUT"/>
6
Q Locker

À partir d'Android O, voici le moyen de créer un raccourci:

            if (ShortcutManagerCompat.isRequestPinShortcutSupported(context)) {
                final ShortcutManager shortcutManager = getSystemService(ShortcutManager.class);

                ShortcutInfo pinShortcutInfo = new ShortcutInfo.Builder(context, shortcutId)
                        .setIcon(Icon.createWithResource(context, R.mipmap.ic_launcher))
                        .setShortLabel(label)
                        .setIntent(new Intent(context, MainActivity.class).setAction(Intent.ACTION_MAIN))
                        .build();
                shortcutManager.requestPinShortcut(pinShortcutInfo, null);
            }

Malheureusement, il a beaucoup de limites:

  1. Nécessite que l'utilisateur accepte de l'ajouter.
  2. Ne peut être ajouté/supprimé en arrière-plan. 
  3. Vous êtes censé pouvoir le mettre à jour, mais pour moi cela n'a pas fonctionné.
  4. Ne sera pas supprimé si l'application ciblée est supprimée. Seul celui qui l'a créé.
  5. Impossible de créer l'icône en fonction d'une ressource de l'application ciblée, sauf s'il s'agit de l'application en cours. Vous pouvez le faire à partir d'un bitmap cependant.

Avant Android, vous pouvez également utiliser ShortcutManagerCompat pour créer de nouveaux raccourcis, sans aucune de ces limitations.

6
android developer

Depuis API level 26, l'utilisation de com.Android.launcher.action.INSTALL_SHORTCUT est obsolète. La nouvelle façon de créer des raccourcis utilise ShortcutManager

Il est mentionné qu'il existe 3 types de raccourcis: statique, dynamique et épinglé . Selon vos besoins, vous pouvez choisir de les créer.

3
noob

@Siddiq Abu Bakkar Answer fonctionne. Toutefois, afin d'éviter de créer des raccourcis à chaque lancement d'application, utilisez les préférences partagées.

final String PREF_FIRST_START = "AppFirstLaunch";
 SharedPreferences settings = getSharedPreferences(PREF_FIRST_START, 0);
    if(settings.getBoolean("AppFirstLaunch", true)){

        // record the fact that the app has been started at least once
        settings.edit().putBoolean("AppFirstLaunch", false).commit();
        ShortcutIcon();

    }
2
Krishnadas PC
final Intent shortcutIntent = new Intent(this, SomeActivity.class);

final Intent intent = new Intent();
intent.putExtra(Intent.EXTRA_SHORTCUT_INTENT, shortcutIntent);
// Sets the custom shortcut's title
intent.putExtra(Intent.EXTRA_SHORTCUT_NAME, getString(R.string.app_name));
// Set the custom shortcut icon
intent.putExtra(Intent.EXTRA_SHORTCUT_ICON_RESOURCE, Intent.ShortcutIconResource.fromContext(this, R.drawable.icon));
// add the shortcut
intent.setAction("com.Android.launcher.action.INSTALL_SHORTCUT");
sendBroadcast(intent);
1
Piush Kumar
public static void addShortcutToHomeScreen(Context context)
{
    if (ShortcutManagerCompat.isRequestPinShortcutSupported(context))
    {
        ShortcutInfoCompat shortcutInfo = new ShortcutInfoCompat.Builder(context, "#1")
                .setIntent(new Intent(context, YourActivity.class).setAction(Intent.ACTION_MAIN)) // !!! intent's action must be set on oreo
                .setShortLabel("Test")
                .setIcon(IconCompat.createWithResource(context, R.drawable.ic_launcher))
                .build();
        ShortcutManagerCompat.requestPinShortcut(context, shortcutInfo, null);
    }
    else
    {
        // Shortcut is not supported by your launcher
    }
}

Je l'ai utilisé, mais certains appareils de l'écran d'accueil ajoutent 2 icônes. Je n'ai pas compris??

0
selçuk doğan