GCM推送通知大图标大小

Ram*_*eya 15 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);
        }
Run Code Online (Sandbox Code Playgroud)

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

Osc*_*udo 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;
    }
}
Run Code Online (Sandbox Code Playgroud)

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

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

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

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);
}           
Run Code Online (Sandbox Code Playgroud)

这对我有用.我希望你能用它.

  • @ user25你所指的是状态栏图标指南,但OP和回答者所讨论的是通过[`NotificationCompat.Builder.setLargeIcon()`](https://developer.android)设置的图像的大小. COM /参考/机器人/支撑/ V4 /应用/ NotificationCompat.Builder.html#setLargeIcon(android.graphics.Bitmap)). (2认同)

Ran*_*jit 11

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

如果你已经有了图像..那么你可以设置它

  .setLargeIcon(BitmapFactory.decodeResource(context.getResources(),R.drawable.ic_app_sky))
  .setSmallIcon(R.drawable.ic_aaja_icon_red)
Run Code Online (Sandbox Code Playgroud)

总数:

 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));
Run Code Online (Sandbox Code Playgroud)

您也可以从本教程中获得帮助..

编辑:要从这里更改位图大小..taken ..

Bitmap bitmap = BitmapFactory.decodeByteArray(imageAsBytes, 0, imageAsBytes.length)
profileImage.setImageBitmap(Bitmap.createScaledBitmap(bitmap , 64, 64, false));
Run Code Online (Sandbox Code Playgroud)