Join FlipAndroid.COM Telegram Group: https://t.me/joinchat/F_aqThGkhwcLzmI49vKAiw


Android: la notificación deja de actualizarse una vez que se ha actualizado durante un determinado número de veces en Kit-Kat

Así que tengo una notificación en mi aplicación. La notificación tiene texto y una imagen que obtengo de un LruCache que relleno al principio. El problema es que en los dispositivos de Kit-Kat (Moto E, XIomi) en mi caso, la notificación deja de actualizarse si ya ha actualizado un número fijo de veces, digamos n (este n suele ser fijo para cada dispositivo y es < 10). Este es mi código para actualizar

String title = CommonUtils.getTitleFromID(id, context); Bitmap bitmap = DataProvider.getInstance(context).diskLruImageCache.getBitmap(id + ""); if (playbackPaused) { bigView.setImageViewResource(R.id.pause, R.drawable.pause_noti); smallView.setImageViewResource(R.id.pause1, R.drawable.pause_noti); remoteViews.setImageViewResource(R.id.pause2, R.drawable.pause_noti); playbackPaused = false; Log.d(TAG, "noti-false"); } bigView.setTextViewText(R.id.title, title + ""); bigView.setImageViewBitmap(R.id.img, bitmap); smallView.setTextViewText(R.id.title1, title); smallView.setImageViewBitmap(R.id.img1, bitmap); mNotificationManager.notify(NOTIFY_ID, notification); 

He intentado con un poco de depuración y todo y he encontrado que si no se establece el mapa de bits, (y sólo hacer
bitmap = null ) entonces todo funciona bien.

No entiendo por qué esto está sucediendo. Este problema es Android versión específica ya que ya probado en Nexus 5 (Lollipop) y otros teléfonos Android 5, pero allí no sucede. ¿Alguien tiene alguna idea de cuál puede ser la razón detrás de esto?

No estoy esperando una situación exacta. Incluso algunas ideas en la dirección correcta serán muy útiles. Gracias !!

También estoy agregando el código para mi DiskLruCache en caso de que podría ser necesario,

 public class DiskLruImageCache { private DiskLruCache mDiskCache; private Bitmap.CompressFormat mCompressFormat = Bitmap.CompressFormat.JPEG; private int mCompressQuality = 70; private static final int APP_VERSION = 1; private static final int VALUE_COUNT = 1; private static final String TAG = "DiskLruImageCache"; public DiskLruImageCache( Context context,String uniqueName, int diskCacheSize, Bitmap.CompressFormat compressFormat, int quality ) { try { final File diskCacheDir = getDiskCacheDir(context, uniqueName ); mDiskCache = DiskLruCache.open( diskCacheDir, APP_VERSION, VALUE_COUNT, diskCacheSize ); mCompressFormat = compressFormat; mCompressQuality = quality; } catch (IOException e) { e.printStackTrace(); } } private boolean writeBitmapToFile( Bitmap bitmap, DiskLruCache.Editor editor ) throws IOException { OutputStream out = null; try { out = new BufferedOutputStream( editor.newOutputStream( 0 ), Utils.IO_BUFFER_SIZE ); return bitmap.compress( mCompressFormat, mCompressQuality, out ); } finally { if ( out != null ) { out.close(); } } } private boolean writeUriToFile( Uri bitmap, DiskLruCache.Editor editor ) throws IOException, FileNotFoundException { OutputStream out = null; try { out = new BufferedOutputStream( editor.newOutputStream( 0 ), Utils.IO_BUFFER_SIZE ); return true; } finally { if ( out != null ) { out.close(); } } } private File getDiskCacheDir(Context context, String uniqueName) { // Check if media is mounted or storage is built-in, if so, try and use external cache dir // otherwise use internal cache dir final String cachePath = Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState()) || !Utils.isExternalStorageRemovable() ? Utils.getExternalCacheDir(context).getPath() : context.getCacheDir().getPath(); return new File(cachePath + File.separator + uniqueName); } public void put( String key, Bitmap data ) { DiskLruCache.Editor editor = null; try { editor = mDiskCache.edit( key ); if ( editor == null ) { return; } if( writeBitmapToFile( data, editor ) ) { mDiskCache.flush(); editor.commit(); if ( BuildConfig.DEBUG ) { Log.d( "cache_test_DISK_", "image put on disk cache " + key ); } } else { editor.abort(); if ( BuildConfig.DEBUG ) { Log.d( "cache_test_DISK_", "ERROR on: image put on disk cache " + key ); } } } catch (IOException e) { if ( BuildConfig.DEBUG ) { Log.d( "cache_test_DISK_", "ERROR on: image put on disk cache " + key ); } try { if ( editor != null ) { editor.abort(); } } catch (IOException ignored) { } } } public void put( String key, Uri data ) { DiskLruCache.Editor editor = null; try { editor = mDiskCache.edit( key ); if ( editor == null ) { return; } if( writeUriToFile( data, editor ) ) { mDiskCache.flush(); editor.commit(); if ( BuildConfig.DEBUG ) { Log.d( "cache_test_DISK_", "image put on disk cache " + key ); } } else { editor.abort(); if ( BuildConfig.DEBUG ) { Log.d( "cache_test_DISK_", "ERROR on: image put on disk cache " + key ); } } } catch (IOException e) { if ( BuildConfig.DEBUG ) { Log.d( "cache_test_DISK_", "ERROR on: image put on disk cache " + key ); } try { if ( editor != null ) { editor.abort(); } } catch (IOException ignored) { } } } public synchronized Bitmap getBitmap( String key ) { Bitmap bitmap = null; DiskLruCache.Snapshot snapshot = null; try { snapshot = mDiskCache.get( key ); if ( snapshot == null ) { return null; } final InputStream in = snapshot.getInputStream( 0 ); if ( in != null ) { final BufferedInputStream buffIn = new BufferedInputStream( in, Utils.IO_BUFFER_SIZE ); bitmap = BitmapFactory.decodeStream(buffIn); } } catch ( IOException e ) { e.printStackTrace(); } finally { if ( snapshot != null ) { snapshot.close(); } } if ( BuildConfig.DEBUG ) { Log.d( "cache_test_DISK_", bitmap == null ? "" : "image read from disk " + key); } return bitmap; } public boolean containsKey( String key ) { boolean contained = false; DiskLruCache.Snapshot snapshot = null; try { snapshot = mDiskCache.get( key ); contained = snapshot != null; } catch (IOException e) { e.printStackTrace(); } finally { if ( snapshot != null ) { snapshot.close(); } } return contained; } public boolean removeKey( String key ) { boolean removed=false; DiskLruCache.Snapshot snapshot = null; try { removed = mDiskCache.remove( key ); } catch (IOException e) { e.printStackTrace(); } finally { if ( snapshot != null ) { snapshot.close(); } } return removed; } public void clearCache() { if ( BuildConfig.DEBUG ) { Log.d("cache_test_DISK_", "disk cache CLEARED"); } try { mDiskCache.delete(); } catch ( IOException e ) { e.printStackTrace(); } } public File getCacheFolder() { return mDiskCache.getDirectory(); } } 

  • Android: ¿Notification.DEFAULT_VIBRATE requiere permiso de vibración?
  • Añadir acción de botón en la notificación personalizada
  • Cómo configurar NAVIGATION_MODE_LIST en la barra de herramientas new appcompat v7 21
  • ¿Cómo actualizar la notificación con RemoteViews?
  • Notificaciones en horario específico cada día android
  • ¿Por qué NotificationManagerCompat :: cancelAll () obtiene SecurityException?
  • PendingIntent de la segunda acción sobrescribe la primera acción y el contenidoIntent for Notification
  • La notificación push funciona incorrectamente cuando la aplicación está en segundo plano o no se está ejecutando
  • One Solution collect form web for “Android: la notificación deja de actualizarse una vez que se ha actualizado durante un determinado número de veces en Kit-Kat”

    Poner si la condición para kitkat y versiones más bajas … después de la versión kitkat cambios en color en el sistema de notificación .. mi mipmap notificar img siz es 96 * 96

      NOTIFICATION_ID= Integer.parseInt(arr_msg[7].toString()); mBuilder.setSmallIcon(R.mipmap.alert_nodification_icon) .setLargeIcon(BitmapFactory.decodeResource(getResources(), R.mipmap.alert_nodification_icon)) .setContentTitle(notification_vehicle_no) .setStyle(new NotificationCompat.BigTextStyle() .bigText(notification_msg)) .setContentText(notification_msg);} mBuilder.setContentIntent(contentIntent); Notification notification = mBuilder.build(); notification.flags |= Notification.FLAG_AUTO_CANCEL; notification.defaults |= Notification.DEFAULT_SOUND; notification.defaults |= Notification.DEFAULT_VIBRATE; mNotificationManager.notify(NOTIFICATION_ID,notification); 
    FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.