wake-up-neo.com

GCM-Pushbenachrichtigung Große Symbolgröße

Hallo, ich implementiere Push-Benachrichtigungen in Android mit GCM. Ich versuche, ein Bild für die Benachrichtigung anstelle des Standard-App-Symbols festzulegen. Dies kann ich mit folgendem Code erreichen

if(extras.getString("src") != null){
            URL url = new URL(extras.getString("src"));
            HttpURLConnection connection = (HttpURLConnection) url.openConnection();
            connection.setDoInput(true);
            connection.connect();
            InputStream input = connection.getInputStream();
            Bitmap large_icon = BitmapFactory.decodeStream(input);
            mBuilder.setLargeIcon(large_icon);
        }

Normalerweise stammt das Bild aus dem Web (jpg, png usw.) und nicht etwas auf dem Gerät. Der obige Code funktioniert, aber das Bild ist entweder zu groß oder zu klein. Ich möchte die optimale Größe oder das optimale Seitenverhältnis für die Bitmap erfahren, damit ich ein entsprechendes Bild liefern kann

15
Ram G Athreya

Ich hatte das gleiche Problem. So löse ich es:

Zunächst müssen Sie die maximalen Größen des Benachrichtigungssymbols abhängig von der Geräteauflösung kennen. Auf der Suche fand ich das:

  • ldpi: 48x48 px * 0,75 
  • mdpi: 64x64 px * 1,00 
  • hDpi: 96 × 96 × 1,50 
  • xhdpi: 128x128 px * 2,00 
  • xxhdpi: 192x192 px * 3,00

Es gibt zwei Ansätze:

  • Zum einen müssen Sie eine Reihe von Bildern in dieser Dimension auf dem Server haben und diese abhängig von Ihrer Geräteauflösung abrufen.
  • Das andere ist, das größere Bild auf dem Server zu haben und die Größe in der App entsprechend der Auflösung Ihres Geräts zu ändern.

Ich erkläre Ihnen den zweiten, den ich umsetze.

Um das Image von einer URL abzurufen, verwende ich Folgendes:

public Bitmap getBitmapFromURL(String strURL) {
    try {
        URL url = new URL(strURL);
        HttpURLConnection connection = (HttpURLConnection) url.openConnection();
        connection.setDoInput(true);
        connection.connect();
        InputStream input = connection.getInputStream();
        Bitmap myBitmap = BitmapFactory.decodeStream(input);
        return myBitmap;
    } catch (IOException e) {
        e.printStackTrace();
        return null;
    }
}

Dann muss ich den Faktor für die neue Bildgröße kennen. Ich weiß, dass ich auf dem Server das xxhdpi-Bild mit einem Faktor von * 3,00 habe. Ich verwende das, um den globalen Faktor zu erhalten:

public static float getImageFactor(Resources r){
      DisplayMetrics metrics = r.getDisplayMetrics();
      float multiplier=metrics.density/3f;
      return multiplier;
  }

Jetzt muss ich die Bildgröße ändern und die neue Bitmap im Benachrichtigungssymbol festlegen:

Bitmap bmURL=getBitmapFromURL(largeIcon);
float multiplier= getImageFactor(getResources());
bmURL=Bitmap.createScaledBitmap(bmURL, (int)(bmURL.getWidth()*multiplier), (int)(bmURL.getHeight()*multiplier), false);
if(bmURL!=null){
    mBuilder.setLargeIcon(bmURL);
}           

Diese Arbeit für mich. Ich hoffe du kannst es benutzen.

39
OscarBudo

Wenn ich Ihr Problem perfekt verstanden habe, hilft Ihnen das weiter unten.

Wenn du das Bild schon hast .. dann kannst du es gerne einstellen

  .setLargeIcon(BitmapFactory.decodeResource(context.getResources(),R.drawable.ic_app_sky))
  .setSmallIcon(R.drawable.ic_aaja_icon_red)

Die Gesamtzahl:

 NotificationCompat.Builder builder = new NotificationCompat.Builder(context);
    builder.setNumber(COUNTER)
     .setLargeIcon(BitmapFactory.decodeResource(context.getResources(), R.drawable.ic_app_sky))
     .setSmallIcon(R.drawable.ic_icon_red)
     .setAutoCancel(true)
     .setContentTitle(pushCount > 1 ? "xxx" + pushCount : title)
     .setContentText(pushCount > 1 ? "yyy" : message)
     .setWhen(when)
     .setContentIntent(PendingIntent.getActivity(context, 0, notificationIntent, PendingIntent.FLAG_UPDATE_CURRENT))
   //.setDeleteIntent(PendingIntent.getBroadcast(context, 0, new Intent(Intent.ACTION_CLEAR_NOTIFICATION), PendingIntent.FLAG_CANCEL_CURRENT))
     .setDefaults(Notification.DEFAULT_LIGHTS | Notification.DEFAULT_VIBRATE)
     .setSound(RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION));

Sie können auch Hilfe von diesem Tutorial erhalten.

BEARBEITEN: Zum Ändern einer Bitmap-Größe aus hier ..

Bitmap bitmap = BitmapFactory.decodeByteArray(imageAsBytes, 0, imageAsBytes.length)
profileImage.setImageBitmap(Bitmap.createScaledBitmap(bitmap , 64, 64, false));
11
Ranjit

Die andere Sache, die Sie wissen sollten, ist, dass die Basislayouts auf diesen Bildern Ränder haben. Wenn Sie also versuchen, das Verhalten der Basislayouts in einem benutzerdefinierten Layout nachzuahmen, stellen Sie sicher, dass Sie etwas Ähnliches tun. Weitere Informationen erhalten Sie in notification_template_icon_group.xml.

Hier habe ich die Mathematik in Pixel (64dp - 12dp) für Sie berechnet:

ldpi 48 - 9 = 39
mdpi 64 - 12 = 52
hdpi 96 - 18 = 78
xhdpi 128 - 24 = 104
xxhdpi 192 - 36 = 156
0
Trevor Mack