Nos gustaría habilitar o deshabilitar widgets a través del código. Cuando decimos "deshabilitar" nos referimos a que un widget que está registrado en una aplicación no debe aparecer en la lista de widgets disponibles para el usuario cuando intentan agregar un widget a su pantalla de inicio. Esta pregunta se ha formulado, por desgracia, muchas veces sin respuesta .Habilitar o deshabilitar dinámicamente un widget no funciona
Hubo una respuesta por Dianne Hackborn a un widget de cuestión separada, que sugirió que era posible utilizar el gestor de paquete para desactivar widgets:
PackageManager pm = context.getPackageManager();
pm.setComponentEnabledSetting(new ComponentName("com.example.android.apis", ".appwidget.ExampleBroadcastReceiver"),
PackageManager.COMPONENT_ENABLED_STATE_ENABLED, // or DISABLED
PackageManager.DONT_KILL_APP);
Esto, sin embargo, no funciona. El componente del widget seguirá apareciendo en la lista de widgets. Puede ser que AppWidgetService (ubicado en en Base.git de Android en \ src \ base \ services \ java \ com \ android \ server), que carga la lista de widgets disponibles, almacena en caché esta lista de widgets disponibles. Si ese fuera el caso, entonces, el código anterior que habilita o deshabilita el componente del widget funcionaría después de un reinicio del dispositivo porque no habría caché; no es asi.
También he intentado investigar sobre algunos métodos del AppWidgetProvider, como filtrar cualquier evento. No creo que vaya a ninguna parte, porque el AppWidgetService, que rellena la lista, usa el Administrador de paquetes para buscar todos los componentes que capturan la acción ACTION_APPWIDGET_UPDATE en el inicio y cuando se agrega un paquete (es decir, una nueva aplicación es instalado). La única vez que un proveedor está eliminado de esta lista está en una transmisión ACTION_PACKAGE_REMOVED. Dado que los proveedores siempre estarán allí, independientemente del estado habilitado/deshabilitado del componente, he examinado la actividad de la lista real que se muestra desde la aplicación Launcher cuando el usuario long- hace clic en el escritorio y agrega un widget: AppWidgetPickActivity en Settings.GIT en com.android.settings. Esto, lamentablemente, rellena la lista directamente desde el AppWidgetService, sin ningún tipo de filtrado para el estado del componente enabled : putInstalledAppWidgets vacío (elementos de la lista) { Lista instalado = mAppWidgetManager.getInstalledProviders(); putAppWidgetItems (instalado, nulo, elementos); }
Me encantaría ver si alguien ha superado este obstáculo. Tal vez estoy haciendo lo incorrecto. Todo lo que quiero es poder eliminar un widget de la lista de widgets disponibles para el usuario cuando intenten agregar un widget a su pantalla de inicio.
Cualquier actualización de esta cuestión después de 3 años? –