You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

FCM通知图片不显示求助:后台/终止状态下异常

FCM通知在Android后台/终止状态下图片不显示的解决方案

针对你遇到的FCM通知图片在应用后台或终止状态下无法显示的问题,结合常见场景和排查经验,以下是可行的解决方案:

一、确认FCM消息负载的结构正确性

  • 如果使用通知消息(Notification Payload),必须将图片URL放在notification.image字段中,而非仅在data节点下。系统在后台/终止状态下只会读取notification节点的配置来展示通知,data节点的内容不会被系统自动用于通知展示。
  • 示例正确的通知负载结构:
{
  "notification": {
    "title": "通知标题",
    "body": "通知内容",
    "image": "https://your-image-url.com/image.jpg"
  },
  "token": "device-token"
}

二、改用数据消息自定义通知构建

当应用处于后台或终止状态时,系统对通知消息的处理有诸多限制,改用**数据消息(Data Payload)**可以完全由客户端控制通知的构建逻辑,避免系统限制:

  1. 发送仅包含data节点的FCM消息:
{
  "data": {
    "title": "通知标题",
    "body": "通知内容",
    "image_url": "https://your-image-url.com/image.jpg"
  },
  "token": "device-token"
}
  1. 在FirebaseMessagingService的onMessageReceived方法中,手动下载图片并构建通知:
@Override
public void onMessageReceived(RemoteMessage remoteMessage) {
    Map<String, String> data = remoteMessage.getData();
    String title = data.get("title");
    String body = data.get("body");
    String imageUrl = data.get("image_url");

    // 使用Glide下载图片并构建通知
    Glide.with(this)
         .asBitmap()
         .load(imageUrl)
         .into(new CustomTarget<Bitmap>() {
             @Override
             public void onResourceReady(@NonNull Bitmap resource, @Nullable Transition<? super Bitmap> transition) {
                 NotificationCompat.Builder builder = new NotificationCompat.Builder(getApplicationContext(), CHANNEL_ID)
                         .setSmallIcon(R.drawable.ic_notification)
                         .setContentTitle(title)
                         .setContentText(body)
                         .setStyle(new NotificationCompat.BigPictureStyle().bigPicture(resource))
                         .setPriority(NotificationCompat.PRIORITY_HIGH);

                 NotificationManagerCompat notificationManager = NotificationManagerCompat.from(getApplicationContext());
                 notificationManager.notify(NOTIFICATION_ID, builder.build());
             }

             @Override
             public void onLoadCleared(@Nullable Drawable placeholder) {}
         });
}

三、处理系统与厂商的后台限制

  • Android 8.0+电池优化:部分厂商(如小米、华为、OPPO)的电池优化策略会阻止应用在后台下载图片,需引导用户将应用加入「白名单」或关闭电池优化:
    • 在Manifest中添加权限:
    <uses-permission android:name="android.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS" />
    
    • 代码中请求跳过电池优化:
    Intent intent = new Intent();
    String packageName = getPackageName();
    PowerManager pm = (PowerManager) getSystemService(POWER_SERVICE);
    if (!pm.isIgnoringBatteryOptimizations(packageName)) {
        intent.setAction(Settings.ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS);
        intent.setData(Uri.parse("package:" + packageName));
        startActivity(intent);
    }
    
  • 后台网络权限:Android 10+限制后台网络访问,确保在Manifest中配置:
    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    
    若使用HTTP图片URL,还需添加:
    <application android:usesCleartextTraffic="true">...</application>
    

四、检查通知渠道优先级

Android 8.0+的通知渠道优先级过低会导致系统限制通知的展示效果,需确保渠道的importance设置为IMPORTANCE_HIGH:

NotificationChannel channel = new NotificationChannel(CHANNEL_ID, "通知渠道名称", NotificationManager.IMPORTANCE_HIGH);
NotificationManager notificationManager = getSystemService(NotificationManager.class);
notificationManager.createNotificationChannel(channel);

五、优化图片加载可靠性

  • 确保图片URL使用HTTPS协议:部分旧版本Android系统或厂商系统在后台仅支持HTTPS加载图片,HTTP链接可能被拦截。
  • 缩短图片加载超时时间:系统默认的图片加载超时较短,若使用自定义下载逻辑,可设置合理的超时时间(如10秒),并添加重试机制。

内容的提问来源于stack exchange,提问作者proseon tech

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.30 12:51:35