2017-09-27 1 views
2

J'essaie de définir la petite icône comme vitesse réseau, mais la force de l'application se ferme à chaque fois. Je ne sais pas pourquoi ça arrive. Voici ma méthode de notification. Je reçois l'erreur lorsque j'essaie de définir data_icon. Toute aide serait appréciée.Android Notification Builder setSmallIcon()

public void showNotification(long receiveData) { 
    List<String> connStatus = NetworkUtil.getConnectivityInfo(getApplicationContext()); 
    notificationManager = (NotificationManager) getSystemService("notification"); 
    Boolean notification_state = Boolean.valueOf(PreferenceManager.getDefaultSharedPreferences(getApplicationContext()).getBoolean("notification_state", true)); 
    String wifi_mobile_details = getWifiMobileData(); 
    String s = null; 
    if (receiveData < PlaybackStateCompat.ACTION_PLAY_FROM_MEDIA_ID) { 
     s = "b" + (((int) (receiveData/PlaybackStateCompat.ACTION_PLAY_FROM_MEDIA_ID)) * 10); 
    } else if (receiveData >= PlaybackStateCompat.ACTION_PLAY_FROM_MEDIA_ID && receiveData < 1048576) { 
     s = "k" + (((int) receiveData)/1024); 
    } else if (receiveData >= 1048576 && receiveData < 10485760) { 
     s = "m" + ((int) (((double) receiveData)/104857.6d)); 
    } else if (receiveData >= 10485760 && receiveData <= 20971520) { 
     s = "mm" + (((int) receiveData)/1048576); 
    } else if (receiveData > 20971520) { 
     s = "mmm20"; 
    } 
    data_icon = getResources().getIdentifier(s, "drawable", getPackageName()); 
    String network_name ; 
    if ((connStatus.get(0)).equals("wifi_enabled")) { 
     network_name = (connStatus.get(1)) + " " + (connStatus.get(2)); 
    } else if ((connStatus.get(0)).equals("mobile_enabled")) { 
     network_name = connStatus.get(1); 
    } else { 
     network_name = ""; 
    } 
    DecimalFormat df = new DecimalFormat("#.##"); 
    String speed ; 
    if (receiveData < PlaybackStateCompat.ACTION_PLAY_FROM_MEDIA_ID) { 
     speed = "Speed " + ((int) receiveData) + " B/s" + " " + network_name; 
    } else if (receiveData < 1048576) { 
     speed = "Speed " + (((int) receiveData)/1024) + " KB/s" + " " + network_name; 
    } else { 
     speed = "Speed " + df.format(((double) receiveData)/1048576.0d) + " MB/s" + " " + network_name; 
    } 
    notificationBuilder = (NotificationCompat.Builder) new NotificationCompat.Builder(this) 
      .setSmallIcon(data_icon) 
      .setContentTitle(speed) 
      .setContentText(wifi_mobile_details) 
      .setContentIntent(PendingIntent.getActivity(this, 0, new Intent(this, MainActivity.class), 0)) 
      .setAutoCancel(true); 

    try{ 
     if (notification_state.booleanValue()) { 
      notificationManager.notify(this.nid, notificationBuilder.build()); 
     } else { 
      notificationManager.cancel(this.nid); 
     } 
    }catch (Exception e){ 
     e.printStackTrace(); 
    } 
} 

Voici l'erreur que je reçois: -

java.lang.IllegalArgumentException: Invalid notification (no valid small icon): Notification(pri=0 contentView=com.techx.intenetspeedmeter/0x10900a1 vibrate=null sound=null defaults=0x0 flags=0x10 color=0x00000000 vis=PRIVATE) 
+0

quel est votre API cible? – chornge

+0

Salut, Min API est 16 –

Répondre

1

Le porblem est avec setSmallIcon(data_icon). Vous obtenez data_icon à partir de getResources().getIdentifier() en utilisant s comme nom de ressource dessinable. s est initialement nul et vous lui attribuez une valeur if ... else. Il se peut qu'aucune condition ne soit satisfaite et que votre code ne soit jamais entré dans if ... else et que votre variable s soit encore nulle après cela. Et puis getResources().getIdentifier() méthode retournera 0 et setSmallIcon(data_icon) va lancer une erreur Invalid notification (no valid small icon).

Pouvez-vous s'il vous plaît assurez-vous que votre variable s est pas nul après if ... else et si elle n'est pas nul alors data_icon a resource_id valide autre alors 0.

+0

Oui, je pense aussi, c'est le problème. Il vous manque un dernier '' else'' avec une valeur par défaut-if-nothing-hit affectée à '' s''. Vous pouvez également affecter une valeur par défaut à '' s'' au lieu de '' String s = null; '' '' '' '' '' s = "name_of_your_default_icon"; '' – Grisgram

+0

Je reçois les valeurs de s 0b. Ce n'est pas nul. –

+0

Mais avez-vous un drawable ayant le nom 0b ... et quelle est la valeur de data_icon? –