Pregunta

Lo que quiero hacer es:

1) Estoy dentro de una actividad, hay 2 botones. Si hago clic en el primero, se crea un atajo en mi pantalla de inicio. El atajo abre un html Página que se ha descargado previamente, 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 transmitir a la actividad algunos argumentos adicionales (como cadenas, por ejemplo) ...........

¿Son posibles esas cosas? Encontré algún enlace y algunas preguntas similares como Android: ¿Existe una forma de programación de crear un atajo 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á en desuso y que lo que quiero hacer no es posible .......

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

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

¿Fue útil?

Solución

El código de ejemplo utiliza interfaces indocumentadas (permiso e intención) para instalar un atajo. Como "alguien" le dijo, esto puede no funcionar en todos los teléfonos y puede romper en futuros lanzamientos 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:

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

Luego, en la actividad que recibe la intención, crea una intención 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);

Otros consejos

He desarrollado un método a continuación para crear el icono de acceso directo en Android HomeCreen [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 olvide cambiar su nombre de actividad, recurso de iconos y permiso.

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

Feliz codificación !!!

Editar:

Para un problema duplicado, la primera opción es agregar la línea a continuación en el código, de lo contrario crea uno nuevo cada vez.

addIntent.putExtra("duplicate", false);

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

La transmisión com.android.launcher.action.install_shortcut ya no tiene ningún efecto desde Android Oreo. ENLACE

Si desea admitir todas las versiones de Android, especialmente Android 8.0 o Oreo y más nuevo, use el código a continuación para crear 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
    }
}

Agregue permiso en el archivo manifiesto:

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

Mejoré un poco una solución arriba. Ahora guarda preferencias si ya se agregó un atajo y no lo agrega en nuevos lanzamientos de una aplicación si el usuario lo elimina. 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();
}

A partir de Android O, esta es la forma 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 el fondo.
  3. Se supone que debes actualizarlo, pero para mí no funcionó.
  4. No se eliminará si se elimina la aplicación dirigida. Solo el que lo creó.
  5. No se puede crear el icono basado en un recurso de la aplicación específica, excepto si es de la aplicación actual. Sin embargo, puedes hacerlo desde un mapa de bits.

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

Ya que API level 26, usando com.android.launcher.action.INSTALL_SHORTCUT es obsoleto. La nueva forma de crear atajos está usando ShortcutManager.

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

@Siddiq Abu Bakkar Respuesta funciona. Pero para evitar la creación de acceso directo cada vez que se inicia la aplicación, use 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();

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

Lo he usado, pero algunos dispositivos en la pantalla de inicio agregan 2 iconos. ¿¿No entendía??

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top