首页 > 解决方案 > java.lang.NoSuchMethodError:类 Landroid/support/v4/app/NotificationCompat$Builder 中没有直接方法 V;或其超类

问题描述

我卡在推送通知中。我正在处理旧版本的代码。我已经更新了它,并在应用程序build.gradlefirebase添加了依赖项之后。当应用程序在后台时,它会因以下错误而崩溃。但是在前台,我收到了通知。请帮我。构建等级在这里https://gist.github.com/pawandeepka/a9c8b8bb80924822ca891334f6f9b086

E/AndroidRuntime: FATAL EXCEPTION: Firebase-MyFirebaseMessagingService
Process: PID: 9735
java.lang.NoSuchMethodError: No direct method <init>(Landroid/content/Context;Ljava/lang/String;)V in class Landroid/support/v4/app/NotificationCompat$Builder; or its super classes (declaration of 'android.support.v4.app.NotificationCompat$Builder' appears in /data/app/com.affichi-2/split_lib_dependencies_apk.apk)
    at com.google.firebase.messaging.zzb.zzf(Unknown Source)
    at com.google.firebase.messaging.zzc.zzas(Unknown Source)
    at com.google.firebase.messaging.FirebaseMessagingService.zzd(Unknown Source)
    at com.google.firebase.iid.zzb.run(Unknown Source)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1113)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588)
    at com.google.android.gms.common.util.concurrent.zza.run(Unknown Source)
    at java.lang.Thread.run(Thread.java:818)

请检查这个类: -

public class MyFirebaseMessagingService extends FirebaseMessagingService {

@Override
public void onMessageReceived(RemoteMessage remoteMessage) {
    try {
        if (remoteMessage.getNotification() != null) {

            Log.e("remoteMessage1", "=" + remoteMessage.getNotification().getTitle());
            Log.e("remoteMessage2", "=" + remoteMessage.getNotification().getBody());
            Log.e("remoteMessage5", "=" + remoteMessage.getData());
            sendNotification(remoteMessage.getData());
            //sendNotification(remoteMessage.getNotification().getTitle(), remoteMessage.getNotification().getBody(), remoteMessage.getData());
        }

    } catch (Exception e) {
        e.printStackTrace();
    }
}

private void sendNotification(String title, String messageBody, java.util.Map<java.lang.String, java.lang.String> getData) {
    try {
        Intent intent = null;

        intent = new Intent(this, HomeActivity.class);

        int oneTimeID = (int) SystemClock.uptimeMillis();
        intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
        PendingIntent pendingIntent = PendingIntent.getActivity(this, oneTimeID /* Request code */, intent,
                PendingIntent.FLAG_ONE_SHOT);

        String channelId = getString(R.string.default_notification_channel_id);

        Uri defaultSoundUri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
        Notification.Builder notificationBuilder =
                new Notification.Builder(this)
                        .setSmallIcon(R.drawable.app_icon)
                        .setContentTitle(title)
                        .setContentText(messageBody)
                        .setAutoCancel(true)
                        .setPriority(Notification.PRIORITY_MAX)
                        .setSound(defaultSoundUri)
                        .setDefaults(Notification.DEFAULT_SOUND | Notification.DEFAULT_VIBRATE)
                        .setContentIntent(pendingIntent);

        NotificationManager notificationManager =
                (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
            NotificationChannel channel = new NotificationChannel(channelId,
                    "Afifchi",
                    NotificationManager.IMPORTANCE_DEFAULT);
            assert notificationManager != null;
            notificationManager.createNotificationChannel(channel);
        }
        assert notificationManager != null;

        notificationManager.notify(oneTimeID /* ID of notification */, notificationBuilder.build());
    } catch (Exception e) {
        e.printStackTrace();
    }
}

private void sendNotification(Map<String, String> messageBody) {
    Intent intent = new Intent(this, MainActivity.class);

    intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
    PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, intent, PendingIntent.FLAG_ONE_SHOT);

    String channelId = getString(R.string.default_notification_channel_id);
    Uri defaultSoundUri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
    NotificationCompat.Builder notificationBuilder =
            new NotificationCompat.Builder(this)
                    .setSmallIcon(R.drawable.ic_launcher)
                    .setContentTitle(messageBody.get("title"))
                    .setContentText(messageBody.get("message"))
                    .setAutoCancel(true)
                    .setSound(defaultSoundUri)
                    .setContentIntent(pendingIntent);

    NotificationManager notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);

    // Since android Oreo notification channel is needed.
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
        NotificationChannel channel = new NotificationChannel(channelId, "Channel human readable title", NotificationManager.IMPORTANCE_DEFAULT);
        notificationManager.createNotificationChannel(channel);
    }

    notificationManager.notify(0, notificationBuilder.build());
}

}

标签: androidfirebase-cloud-messagingandroid-multidex

解决方案


您正在使用已弃用的构造函数NotificationCompat.Builder (Context context)

请改用此构造函数NotificationCompat.Builder (Context context, String channelId)


推荐阅读