Android crea atajos en la pantalla de inicio

Lo que quiero hacer es:

1) Estoy dentro de una actividad, hay 2 botones. Si hago clic en el primero, se crea un acceso directo en la pantalla de inicio. El acceso directo abre una página html que se descargó anteriormente, por lo que quiero que use el navegador predeterminado, pero no quiero usar Internet porque ya tengo la página.

2) El segundo botón crea otro atajo que inicia una actividad. Y quiero pasar a la actividad algunos argumentos adicionales (como cadenas, por ejemplo) ………..

¿Son esas cosas posibles? Encontré algunos enlaces y algunas preguntas similares, como Android: ¿Existe alguna forma de progtwigción para crear un acceso directo web en la pantalla de inicio?

Parecen ser la respuesta a mi pregunta, pero alguien me dijo que este código no funcionará en todos los dispositivos y que está obsoleto y que lo que quiero hacer no es posible …….

Esta técnica no es recomendable. Esta es una implementación interna, que no forma parte del SDK de Android. No funcionará en todas las implementaciones de pantalla de inicio. Es posible que no funcione en todas las versiones anteriores de Android. Es posible que no funcione en futuras versiones de Android, ya que Google no está obligado a mantener las interfaces internas no documentadas. Por favor no use esto

¿Qué significa implementación interna? Es ese código confiable o no … ayúdame por favor …..

El código de ejemplo usa interfaces no documentadas (permiso e intención) para instalar un atajo. Como “alguien” te dijo, es posible que esto no funcione en todos los teléfonos y que pueda fallar en futuras versiones de Android. No lo hagas

La forma correcta es escuchar una solicitud de acceso directo desde la pantalla de inicio, con un filtro de intención como en su manifiesto:

       

Luego, en la actividad que recibe el bash, crea un bash para su atajo y lo devuelve como resultado de la actividad.

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

He desarrollado un método a continuación para crear el icono de acceso directo en Android Homescreen [Probado en mi propia aplicación]. Solo llámalo.

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

No olvides cambiar tu nombre de actividad, recurso de icono y permiso.

  

¡Feliz encoding!

Editar:

Para el Problema duplicado, la primera opción es agregar la línea siguiente en el código; de lo contrario, crea una nueva cada vez.

 addIntent.putExtra("duplicate", false); 

La segunda opción es desinstalar primero el icono de acceso directo a la aplicación y luego instalarlo de nuevo si la primera opción no funcionó.

Mejoré un poco la solución anterior. Ahora guarda en las preferencias si ya se agregó un atajo y no lo agrega en los nuevos lanzamientos de una aplicación si el usuario lo eliminó. Esto también ahorra un poco de tiempo, ya que el código para agregar un atajo existente ya no se ejecuta.

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

La transmisión com.android.launcher.action.INSTALL_SHORTCUT ya no tiene ningún efecto desde android oreo. ENLAZAR

Si desea admitir todas las versiones de Android, especialmente android 8.0 u oreo y más recientes , use el siguiente código para crear un acceso directo:

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

Agregar permiso en el archivo de manifiesto:

  

A partir de Android O, esta es la manera de crear un atajo:

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

Tiene muchas limitaciones, lamentablemente:

  1. Requiere que el usuario acepte agregarlo.
  2. No se puede agregar / eliminar en segundo plano.
  3. Se supone que debes poder actualizarlo, pero para mí no funcionó.
  4. No se eliminará si se elimina la aplicación de destino. Solo el que lo creó.
  5. No se puede crear el icono en función de un recurso de la aplicación seleccionada, excepto si se trata de la aplicación actual. Aunque puedes hacerlo desde un bitmap.

Para pre-Android O, puede usar ShortcutManagerCompat para crear nuevos accesos directos también, sin ninguna de esas limitaciones.

@Siddiq Abu Bakkar Answer funciona. Pero para evitar crear atajos cada vez que se inicie la aplicación, use las Preferencias compartidas.

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

Desde API level 26 , el uso de com.android.launcher.action.INSTALL_SHORTCUT está en desuso. La nueva forma de crear accesos directos está usando ShortcutManager .

Menciona que hay 3 tipos de atajos, estáticos, dynamics y fijados. Según sus requisitos, puede elegir crearlos.

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