GCM推送通知大图标大小

时间:2014-07-30 07:09:14

标签: android android-notifications google-cloud-messaging

我喜欢使用GCM在Android中实现推送通知。我正在尝试为通知设置图像而不是默认的应用程序图标。我可以使用以下代码实现此目的

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);
        }

通常情况下,图片来自网页(jpg,png等),而不是设备中的内容。上面的代码有效,但图像太大或太小。我想知道位图的最佳大小或宽高比,以便我可以提供合适的图像

3 个答案:

答案 0 :(得分:39)

我遇到了同样的问题。这就是我解决它的方法:

首先,您需要知道通知图标的最大大小,具体取决于设备分辨率。搜索,我发现了这个:

  • ldpi:48x48 px * 0.75
  • mdpi:64x64 px * 1.00
  • hdpi:96x96 px * 1.50
  • xhdpi:128x128 px * 2.00
  • xxhdpi:192x192 px * 3.00

有两种方法:

  • 一个是在服务器的那些维度中拥有一组图像,并根据您的设备分辨率获取它们。
  • 另一个是在服务器中放大图像,并根据您的设备分辨率在应用中调整大小。

我将向您解释我实施的第二个。

首先从URL获取图像我使用它:

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;
    }
}

然后我需要知道新图像尺寸的因素。我知道在服务器中我有xxhdpi图像的因子为* 3.00,我用它来获得全局因子:

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

现在我必须调整图像大小并在通知图标中设置新位图:

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);
}           

这项工作对我而言。我希望你能用它。

答案 1 :(得分:11)

如果我完全理解你的问题,那么下面的内容会对你有帮助。

如果您已经有了图片..那么您可以将其设置为

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

总计:

 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));

您也可以从tutorial ..

获得帮助

编辑:要更改位图大小..来自here..

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

答案 2 :(得分:0)

这里要知道的另一件事是基本布局在这些图像上有边距,所以如果你试图模仿自定义布局中基本布局所看到的行为,请确保做类似的事情。有关详细信息,请查看notification_template_icon_group.xml。

这里我为你计算了数学像素(64dp - 12dp):

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