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

Android基于Firebase推送通知无法显示图片问题求助

Fixing Firebase Notification Image Display Issue on Android

Hey there, let's work through why your notification image isn't showing up even when you've converted the image URL to a Bitmap. Looking at your code, I spot a few key issues that are likely causing this problem—here's what to fix:

1. You're loading the image synchronously on the main thread

Picasso's get() method runs synchronously, which means you're blocking the main thread to load a network resource. Android strictly forbids network operations on the main thread (since API 11), so this might be throwing a hidden NetworkOnMainThreadException (even with your try/catch, sometimes the stack trace doesn't show up clearly). Worse, by the time the image finishes loading, you've already built and posted the notification—so the updated style with the big picture never gets applied.

Fix: Load the image asynchronously with Picasso's callback

Rewrite your code to use Picasso's into() method with a Target callback, so the notification only gets finalized and shown after the image is loaded:

private void getNotification(String title, String message, String imageUrl){
    Intent intent = new Intent(this, DashboardActivity.class);
    intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
    // Add FLAG_IMMUTABLE for Android 12+ compatibility
    PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, intent, 
            PendingIntent.FLAG_ONE_SHOT | PendingIntent.FLAG_IMMUTABLE); 
    Uri defaultSoundUri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
    
    // Build the base notification first
    final NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(this, "YOUR_UNIQUE_CHANNEL_ID")
            .setLargeIcon(BitmapFactory.decodeResource(getResources(), R.drawable.logo))
            .setSmallIcon(R.drawable.logo)
            .setContentTitle(title)
            .setContentText(message)
            .setAutoCancel(true)
            .setSound(defaultSoundUri)
            .setDefaults(Notification.DEFAULT_SOUND | Notification.DEFAULT_VIBRATE)
            .setContentIntent(pendingIntent);

    if (imageUrl != null) {
        Picasso.get().load(imageUrl).into(new Target() {
            @Override
            public void onBitmapLoaded(Bitmap bitmap, Picasso.LoadedFrom from) {
                // Compress the bitmap to avoid size limits (optional but recommended)
                Bitmap compressedBitmap = compressBitmap(bitmap);
                notificationBuilder.setStyle(new NotificationCompat.BigPictureStyle().bigPicture(compressedBitmap));
                showFinalNotification(notificationBuilder);
            }

            @Override
            public void onBitmapFailed(Exception e, Drawable errorDrawable) {
                // Fallback to basic notification if image load fails
                showFinalNotification(notificationBuilder);
                e.printStackTrace();
            }

            @Override
            public void onPrepareLoad(Drawable placeHolderDrawable) {
                // Optional: Show a placeholder while loading
            }
        });
    } else {
        // No image URL—show the basic notification right away
        showFinalNotification(notificationBuilder);
    }
}

// Helper to handle notification channels and show the notification
private void showFinalNotification(NotificationCompat.Builder builder) {
    NotificationManager notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
    
    // Create a notification channel for Android 8.0+ (required)
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
        NotificationChannel channel = new NotificationChannel("YOUR_UNIQUE_CHANNEL_ID", 
                "App Notifications", NotificationManager.IMPORTANCE_DEFAULT);
        notificationManager.createNotificationChannel(channel);
    }
    
    notificationManager.notify((int) System.currentTimeMillis(), builder.build());
}

// Helper to compress large bitmaps to fit notification limits
private Bitmap compressBitmap(Bitmap bitmap) {
    ByteArrayOutputStream stream = new ByteArrayOutputStream();
    bitmap.compress(Bitmap.CompressFormat.JPEG, 80, stream);
    byte[] byteArray = stream.toByteArray();
    return BitmapFactory.decodeByteArray(byteArray, 0, byteArray.length);
}

2. Missing Notification Channel (Android 8.0+)

Starting with Android 8.0 (API 26), all notifications must be linked to a notification channel. If you skip this step, your notification might not display correctly—including missing images. The code above adds channel creation for compatibility.

3. Network Access Checks

  • Ensure your app has the INTERNET permission in AndroidManifest.xml:
    <uses-permission android:name="android.permission.INTERNET" />
    
  • If your image URL uses http (not https), enable cleartext traffic in AndroidManifest.xml (required for Android 9+):
    <application
        ...
        android:usesCleartextTraffic="true">
        ...
    </application>
    

4. Bitmap Size Constraints

Notifications have limits on how large a bitmap can be. The compressBitmap helper method reduces the bitmap size to ensure it fits within these limits and loads faster.

Try these fixes, and your notification images should start showing up as expected!

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 09:01:53