intent getintextra example developer activity android android-intent launcher

android - getintextra - intent-filter



¿Cómo configurar el iniciador de aplicaciones predeterminado mediante programación? (4)

Quiero que el usuario se vea obligado a seleccionar SIEMPRE en lugar de SOLO UNA VEZ cuando aparezca ese diálogo

Eso no es posible, excepto quizás en dispositivos rooteados, salvo algunas fallas de seguridad en Android.

Cuando hago esto, no recibo la opción entre mi aplicación y el iniciador de acciones

Correcto. Si ya se ha elegido un valor predeterminado, esto simplemente iniciará el valor predeterminado.

Intenté usar startActivity (Intent.createChooser (intento, "Por favor, establezca la configuración del iniciador en SIEMPRE")); y obtengo las opciones entre mi aplicación y el iniciador de acciones, sin embargo, no obtengo las opciones SIEMPRE o SOLO UNA VEZ.

Correcto. createChooser() fuerza una elección, pero no permite establecer un valor predeterminado.

Estoy creando una aplicación de inicio (kiosco) que se podrá descargar a través de Google. Al instalar esta aplicación por primera vez, el usuario tiene la capacidad de elegir qué lanzador (el mío o el stock) será el predeterminado. Estoy tratando de mostrar esto manualmente si el usuario no hace que mi aplicación sea el iniciador predeterminado. Quiero que el usuario se vea obligado a seleccionar SIEMPRE en lugar de SOLO UNA VEZ cuando aparezca ese cuadro de diálogo, de lo contrario, el cuadro de diálogo seguirá apareciendo periódicamente con un mensaje amistoso. Esto es lo que he intentado hasta ahora.

Creé un método para verificar si mi aplicación es la predeterminada

/** * 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; }

Entonces hago el intento de lanzar el selector

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

Cuando hago esto, no recibo la opción entre mi aplicación y el iniciador de acciones. Intenté usar startActivity(Intent.createChooser(intent, "Please set launcher settings to ALWAYS")); y obtengo las opciones entre mi aplicación y el iniciador de acciones, sin embargo, no obtengo las opciones SIEMPRE o SOLO UNA VEZ.

Puedo crear un diálogo personalizado para esto en lugar de iniciar el selector, pero necesito saber cómo configurar el iniciador de aplicaciones predeterminado mediante programación. ¡Gracias por adelantado!


Esto es realmente posible con una pequeña solución:

Cree una Activity vacía que actúe como un FakeLauncherActivity llamado FakeLauncherActivity . Agréguelo a su manifiesto como un componente deshabilitado :

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

Compruebe si su actividad de isMyAppLauncherDefault() deseada es la predeterminada (con isMyAppLauncherDefault() de su pregunta).

Si no, ofrezca al usuario que elija la actividad de iniciador preferida de esta manera:

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

Este método habilita temporalmente FakeLauncherActivity , lo que conduce a un cambio en el conjunto de actividades de FakeLauncherActivity disponibles, lo que obliga a Android a olvidar su iniciador predeterminado. Verás algo como ...

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

... en tu registro.

Luego, el método simplemente abre una intención de iniciador donde puede ver todos los iniciadores instalados y los botones "Siempre" / "Solo una vez". Finalmente, el método deshabilita FakeLauncherActivity nuevamente para que no se muestre en la lista.

Puede repetirlo tantas veces como desee y solo dejar que el usuario continúe si la actividad de iniciador que desea está configurada como predeterminada.


La función isMyAppLauncherDefault () en la pregunta no siempre funciona por alguna razón. Este código podría ser mejor para determinar cuál es el paquete predeterminado para la pantalla INICIO.

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;


Si está implementando la solución Google EMM (Dispositivo dedicado):

https://developer.android.com/work/dpc/dedicated-devices/cookbook

// Create an intent filter to specify the Home category. IntentFilter filter = new IntentFilter(Intent.ACTION_MAIN); filter.addCategory(Intent.CATEGORY_HOME); filter.addCategory(Intent.CATEGORY_DEFAULT); // Set the activity as the preferred option for the device. ComponentName activity = new ComponentName(context, KioskModeActivity.class); DevicePolicyManager dpm = (DevicePolicyManager) context.getSystemService(Context.DEVICE_POLICY_SERVICE); dpm.addPersistentPreferredActivity(adminName, filter, activity);