Widget de aplicación setImageViewUri no actualiza la imagen
Tengo un widget de aplicación, que contiene sólo una imagen. I redibujar esa imagen y almacenar como png en la memoria privada de las aplicaciones y luego establecer la imagen de las RemoteViews con el uri (widget.setImageViewUri (R.id.widget_icon, uri)) en lugar de enviar el mapa de bits a sí mismo, porque en muy raro Situaciones i obtener! ¡TRANSACCIÓN DE BINDER FALLADA !!!
El problema es que a medida que la imagen cambia con el tiempo, la imagen del widget no cambia. Revisé el png guardado con el explorador de raíz y se actualiza correctamente. Pero la imagen correcta no se muestra. Cada widget muestra la imagen desde el momento en que se agregó a la pantalla de inicio. Si yo uso setImageViewBitmap (…) funciona correctamente, excepto la rara transacción de enlace fallido.
- Cómo incrustar widget de SoundCloud en la aplicación para Android
- Actualizar ViewFlipper's Child View cuando ViewFlipper es como Widget
- Tamaño incorrecto de la cuadrícula del widget
- Widget del reproductor de música de Android
- Cambiar el diseño de widgets mediante programación
I actualizar el widget de un servicio con el método siguiente. No funciona en android 2.3.7 y también con el emulador que ejecuta 2.2. ¿Cual podría ser el problema? Es de alguna manera en caché?
public void updateWidget(Context context) { // redraws the widget's image updateIcon(); OutputStream stream; try { stream = context.openFileOutput("icon.png", Context.MODE_WORLD_READABLE); } catch (FileNotFoundException ex) { ex.printStackTrace(); return; } m_Icon.compress(CompressFormat.PNG, 100, stream); try { stream.close(); } catch (IOException ex) { ex.printStackTrace(); } AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context); int[] appWidgetIds = appWidgetManager.getAppWidgetIds(new ComponentName(context, WidgetProvider.class)); Intent intent = new Intent(context, MyDialog.class); intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); PendingIntent clickIntent = PendingIntent.getActivity(context, 0, intent, 0); File file = new File(context.getFilesDir().getAbsolutePath() + File.separator + "icon.png"); // Uri uri = Uri.fromFile(file); // update all widgets on home screen for (int wid : appWidgetIds) { RemoteViews widget = new RemoteViews(context.getPackageName(), R.layout.widget); widget.setOnClickPendingIntent(R.id.widget_layout, clickIntent); // === EDIT === // Uri.fromFile(file); does not work correctly on android 2.1, only 2.2 and up // widget's image will disappear // widget.setImageViewUri(R.id.widget_icon, uri); widget.setImageViewUri(R.id.widget_icon, Uri.parse(file.getPath())); intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, wid); appWidgetManager.updateAppWidget(wid, widget); } }
EDIT: También he intentado un Custom ContentProvider y la configuración de "content: // …" uri, pero con el mismo resultado. El widget muestra la imagen desde el momento en que se agregó a la pantalla de inicio y no se actualiza con el tiempo.
Logcat no muestra ningún error.
- ¿Cómo usar una tipografía personalizada en un widget?
- Implementar ListView en los widgets Android
- AsyncTask para actualizar widget - cómo acceder a textviews en onPostExecute ()?
- Widget de Android no se actualizará
- Coordenadas de la pantalla de inicio de Android y xy
- Actualización de Android Widget
- Widget personalizado de entrada de código PIN de Android
- TextView en el widget de Android no se actualiza
Si el Uri
permanece sin cambios, parece que Android no actualizará la imagen. He encontrado un poco de un hack para evitar esto. Simplemente llame a widget.setImageViewUri(R.id.widget_icon, Uri.parse(""));
Antes de widget.setImageViewUri(R.id.widget_icon, uri);
.
Llama a setImageViewUri()
dos veces, pero parece estar funcionando bien. Me encantaría oír una mejor manera de solucionarlo, ya que estoy experimentando este problema yo mismo.
Bueno, parece que setImageViewUri almacena imágenes en caché y no las actualiza si tienen el mismo nombre.
No es la solución más elegante pero funciona, cada vez que usará un nombre de archivo diferente.
String filename = new String("bitmap-1.png"); // rotate files, due to not being refreshed if same name if ( context.deleteFile(filename) ) { filename = new String("bitmap-0.png"); } FileOutputStream out = context.openFileOutput(filename, Context.MODE_WORLD_READABLE); bitmap.compress(Bitmap.CompressFormat.PNG, 80, out); file = context.getFileStreamPath(filename); out.close(); updateViews.setImageViewUri(R.id.image1,Uri.parse(file.toString()));