widgets tipos studio pagina agregar android widget android-4.0-ice-cream-sandwich launcher

android - tipos - Agregar widgets a una página de inicio sin bindAppWidgetId()



agregar widgets a pagina wordpress (4)

Estoy tratando de convertir el lanzador ICS original en una aplicación independiente. Ya casi estoy allí. Lo único que no funciona es el ícono de búsqueda y la colocación de widgets en la pantalla, lo que provoca un bloqueo.

El bloqueo se debe a que el appWidgetManager.bindAppWidgetId(appWidgetId, componentName); acciones utiliza appWidgetManager.bindAppWidgetId(appWidgetId, componentName); para agregar widgets, que aparentemente solo las aplicaciones del sistema tienen permiso para hacer .

Entonces, mi pregunta es, ¿cuál es la forma correcta de que una aplicación que no sea del sistema agregue widgets y logre la misma experiencia de interfaz de usuario que el lanzador ICS original ?


Acabo de encontrar este tutorial sobre cómo agregar appwidgets a las aplicaciones normales, lo que podría ayudar: http://coderender.blogspot.com/2012/01/hosting-android-widgets-my.html

Este tutorial aún usa la lista del "Selector de AppWidget", por lo que podría no funcionar para usted ya que ICS tiene el selector de widgets dentro del mismo cajón de la aplicación.

Aún así, valió la pena mencionar ya que los tutoriales sobre widgets de hosting son muy raros :)

Aclamaciones,
Yuvi


Ahora sé la respuesta definitiva. En Android 4.0, no puedes hacerlo. Terminé haciendo que mis usuarios eligieran el widget dos veces, lo que apesta, pero no hay forma de evitarlo.

En Android 4.1 solucionaron el problema!

¡Las aplicaciones SDK ahora pueden alojar widgets y no tienen que usar la API del selector de widgets de basura! Puede consultar el código fuente de Jellybean Launcher2 para obtener detalles, pero básicamente, cuando intenta enlazar un widget por primera vez, Android abrirá un cuadro de diálogo que dice "¿Desea permitir que esta aplicación vincule widgets" y luego el usuario puede Decidir darle permiso o no.

No estoy seguro de por qué optaron por el cuadro de diálogo de concesión de permisos modales en lugar del modelo de todos los permisos de instalación que utilizaron para todo lo demás, pero, ¡lo que sea, funciona!

¡Ahora solo tenemos que esperar 4 o 5 años hasta que todos tengan Android 4.1 o superior!


Fuzzical Logic, con tu código debajo,

AppWidgetProviderInfo withWidgetInfo = AppWidgetManager.getInstance().getAppWidgetInfo(forWidgetId); AppWidgetHostView hostView = myWidgetHost.createView(myContext, forWidgetId, withWidgetInfo); hostView.setAppWidget(forWidgetId, withWidgetInfo);

si no tiene el permiso de bind_widget, widgethost no tiene nada, cus withwidgetinfo es nulo, widgethost no crea nada.


Timmmm,

Tu problema es que estás buscando el objeto equivocado. Realmente no puedes controlar el AppWidgetManager . No es tu trabajo, es del sistema. Lo que PUEDES hacer es controlar un AppWidgetHost , solo requiere algunas semánticas. Aquí están los conceptos básicos.

EDITAR: Fondo adicional en el proceso de vinculación de widgets

El AppWidgetManager es un objeto singleton que se ejecuta cuando se inicia el sistema. Esto significa que cada instancia de cada lanzador utiliza el mismo AppWidgetManager. Lo que los diferencia es su AppWidgetHost y las RemoteViews que tienen actualmente. El AppWidgetManager básicamente mantiene una lista de todos los hosts activos y los widgets que tienen. Un AppWidgetHost no es un objeto privilegiado. Es decir, cualquier actividad puede tener un solo host. Por lo tanto, una aplicación completa puede ser nada más que Widgets, si así lo desean.

Cuando crea una instancia del Host, debe agregarle Vistas. Así que, básicamente, es una lista de Vistas infantiles sin límites parentales obligatorios, excepto por lo que su Actividad le da. Primero, solicita una ID (a través de myHost.allocateAppWidgetId() ). A continuación, utiliza su actividad Widget de selección / Diálogo. El diálogo devuelve el WidgetInfo. La Vista se recupera cuando le pide al Host que cree la Vista (a través de createView ) con WidgetInfo y la ID que solicitó. Entonces le pide al widget su RemoteView .

Finalmente, puede enlazar el widget colocando la Vista en su Actividad como un niño. Esto se hace a través del método addView () del grupo de ViewGroup que contiene todos sus widgets.

El Proceso en Acción (EDITADO)

Primero, debes asegurarte de tener esto en tu manifiesto de Android:

<uses-permission android:name="android.permission.BIND_APPWIDGET" />

A continuación, debe crear un AppWidgetHost (extiendo el mío para mi lanzador). La clave para el Host es mantener una referencia al AppWidgetManager través de AppWidgetManager.getInstance(); .

AppWidgetHost myHost = new AppWidgetHost(context, SOME_NUMERICAL_CONSTANT_AS_AN_ID);

Ahora, obtenga su ID:

myHost.allocateAppWidgetId()

El siguiente paso se realiza mediante cualquier método que utilice para obtener la información del widget. La mayoría de las veces se devuelve a través de un Intent a través de onActivityResult. Ahora, todo lo que tiene que hacer es usar la appInfo y crear la vista. El WidgetId normalmente lo proporciona el resultado de la actividad del widget de selección.

AppWidgetProviderInfo withWidgetInfo = AppWidgetManager.getInstance().getAppWidgetInfo(forWidgetId); AppWidgetHostView hostView = myWidgetHost.createView(myContext, forWidgetId, withWidgetInfo); hostView.setAppWidget(forWidgetId, withWidgetInfo);

Ahora simplemente vincula la Vista como un niño a lo que quieras vincular.

myViewGroup.addView(hostView);

Por supuesto, siempre debe considerar dónde y cómo colocarlo, etc. Además, debe asegurarse de que su AppWidgetHost esté escuchando antes de comenzar a agregar widgets.

myHost.startListening()

Para resumir

El proceso de enlace de widgets abarca muchos métodos y pasos, pero todo ocurre a través de AppWidgetHost . Debido a que los widgets están codificados fuera de su espacio de nombres, no tiene ningún control, excepto dónde los coloca y cómo dimensiona la vista. Dado que en última instancia son códigos que se ejecutan en su espacio pero fuera de su control, AppWidgetManager actúa como un mediador neutral , mientras que AppWidgetHost actúa como facilitador en nombre de su aplicación. Una vez que se entiende esto, su tarea es simple. Los pasos anteriores son todos los pasos necesarios para cualquier lanzador personalizado (incluido el mío).

EDITAR: aclaración final

El Lanzador de ICS también hace esto. El appWidgetManager que utilizan es solo un contenedor que contiene el AppWidgetHost y las llamadas al AppWidgetManager . Olvidé que muy poco de esto se explica en el sitio web de Android Development Central.

¡Espero que esto ayude! Déjame saber si necesitas más detalles.

FuzzicalLogic