Java Android应用程序在试图通过firebase接收推送通知时崩溃

Java Android应用程序在试图通过firebase接收推送通知时崩溃,java,android,firebase,firebase-cloud-messaging,Java,Android,Firebase,Firebase Cloud Messaging,更新: 显然,通过onMessageReceived方法上的“throws NullPointerException”解决了崩溃,但是通知没有到达应用程序 Android Studio建议MyFirebaseMessagingService.java中的方法.getTitle()和.notify()可以生成NullPointerException,但我不知道为什么 各位好, 我正在尝试通过firebase云消息服务向我的应用程序发送推送通知 有两种情况 如果我定期向所有用户发送通知,则不会发

更新:


  • 显然,通过onMessageReceived方法上的“throws NullPointerException”解决了崩溃,但是通知没有到达应用程序


  • Android Studio建议MyFirebaseMessagingService.java中的方法
    .getTitle()
    .notify()
    可以生成NullPointerException,但我不知道为什么

各位好,

我正在尝试通过firebase云消息服务向我的应用程序发送推送通知

有两种情况

  • 如果我定期向所有用户发送通知,则不会发生任何事情。应用程序未收到通知,但没有错误。 2.如果我使用FCM注册令牌发送测试推送通知,应用程序将崩溃
  • 下面是日志:

    2019-12-12 22:47:00.367 5727-5881/com.maunexus D/FA: Logging event (FE): notification_receive(_nr), Bundle[{ga_event_origin(_o)=fcm, ga_screen_class(_sc)=MainActivity, ga_screen_id(_si)=375841024272355326, message_device_time(_ndt)=0, message_type(_nmc)=display, message_name(_nmn)=Yeeey!, message_time(_nmt)=1576183623, message_id(_nmid)=4180683689345961897}]
    2019-12-12 22:47:00.367 5727-5878/com.maunexus E/AndroidRuntime: FATAL EXCEPTION: Firebase-MyFirebaseMessagingService
        Process: com.maunexus, PID: 5727
        java.lang.NullPointerException: Attempt to invoke virtual method 'com.google.firebase.messaging.RemoteMessage$Notification com.google.firebase.messaging.RemoteMessage.getNotification()' on a null object reference
            at com.maunexus.MyFirebaseMessagingService.onMessageReceived(MyFirebaseMessagingService.java:21)
            at com.google.firebase.messaging.FirebaseMessagingService.zzc(com.google.firebase:firebase-messaging@@20.1.0:78)
            at com.google.firebase.messaging.zze.run(com.google.firebase:firebase-messaging@@20.1.0:2)
            at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167)
            at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641)
            at com.google.android.gms.common.util.concurrent.zza.run(Unknown Source:6)
            at java.lang.Thread.run(Thread.java:919)
    2019-12-12 22:47:00.417 5727-5727/com.maunexus I/FIAM.Headless: Removing display event listener
    2019-12-12 22:47:00.434 5727-5878/com.maunexus I/Process: Sending signal. PID: 5727 SIG: 9
    
    MainActivity.java

    package com.maunexus;
    
    import android.app.Activity;
    
    import android.os.Build;
    import android.os.Bundle;
    import android.util.Log;
    import android.view.Menu;
    import android.view.MenuInflater;
    import android.view.MenuItem;
    import android.webkit.CookieManager;
    import android.webkit.WebView;
    import android.webkit.WebViewClient;
    
    import android.widget.Toast;
    
    import androidx.annotation.NonNull;
    import androidx.appcompat.app.AppCompatActivity;
    
    import com.google.android.gms.tasks.OnCompleteListener;
    import com.google.android.gms.tasks.Task;
    import com.google.firebase.iid.FirebaseInstanceId;
    import com.google.firebase.iid.InstanceIdResult;
    
    
    public class MainActivity extends AppCompatActivity {
    
        private WebView webView;
        Activity activity;
        private static final String TAG = "MainActivity";
    
    
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            activity = this;
    
    
            webView = (WebView) findViewById(R.id.webviewid);
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
                CookieManager.getInstance().setAcceptThirdPartyCookies(webView, true);
            }
            webView.getSettings().setJavaScriptEnabled(true);
            webView.getSettings().setJavaScriptCanOpenWindowsAutomatically(false);
            webView.getSettings().setSupportMultipleWindows(false);
            webView.getSettings().setSupportZoom(false);
            webView.setVerticalScrollBarEnabled(false);
            webView.setHorizontalScrollBarEnabled(false);
            webView.getSettings().setLoadWithOverviewMode(true);
            webView.getSettings().setUseWideViewPort(true);
            webView.setWebViewClient(new WebViewClient());
            webView.loadUrl("https://pari365.mg");
    
    
            FirebaseInstanceId.getInstance().getInstanceId()
                    .addOnCompleteListener(new OnCompleteListener<InstanceIdResult>() {
                        @Override
                        public void onComplete(@NonNull Task<InstanceIdResult> task) {
                            if (!task.isSuccessful()) {
    //To do//
                                return;
                            }
    
    // Get the Instance ID token//
                            String token = task.getResult().getToken();
                            String msg = getString(R.string.fcm_token, token);
                            Log.d(TAG, msg);
    
                        }
                    });
    
    
        }
    
        @Override
        public boolean onCreateOptionsMenu(Menu menu) {
            MenuInflater menuInflater = getMenuInflater();
            menuInflater.inflate(R.menu.super_menu, menu);
            return super.onCreateOptionsMenu(menu);
        }
    
    
        @Override
        public boolean onOptionsItemSelected(@NonNull MenuItem item) {
            switch (item.getItemId()) {
                case R.id.menu_back:
                    onBackPressed();
                    break;
    
                case R.id.menu_forward:
                    onForwardPressed();
                    break;
    
                case R.id.menu_refresh:
                    webView.reload();
                    Toast.makeText(this, "Reloading... Please Wait!", Toast.LENGTH_SHORT).show();
                    break;
    
    
            }
            return super.onOptionsItemSelected(item);
        }
    
    
        private void onForwardPressed() {
            if (webView.canGoForward()) {
                webView.goForward();
            } else {
                Toast.makeText(this, "Already there! ;)", Toast.LENGTH_SHORT).show();
            }
        }
    
        public void onBackPressed() {
            if (webView.canGoBack()) {
                webView.goBack();
            }
        }
    }
    
    BuildGrandle应用程序

    apply plugin: 'com.android.application'
    
    android {
        compileSdkVersion 29
        buildToolsVersion "29.0.2"
        defaultConfig {
            applicationId "com.maunexus"
            minSdkVersion 21
            targetSdkVersion 29
            versionCode 1
            versionName "1.0"
            testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
            multiDexEnabled true
        }
        buildTypes {
            release {
                minifyEnabled false
                proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
            }
        }
    }
    
    dependencies {
        implementation fileTree(dir: 'libs', include: ['*.jar'])
        implementation 'androidx.appcompat:appcompat:1.0.2'
        implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
        implementation 'com.google.firebase:firebase-core:17.2.1'
        implementation 'com.google.firebase:firebase-analytics:17.2.1'
        implementation 'com.google.firebase:firebase-messaging:20.1.0'
        implementation 'com.google.firebase:firebase-inappmessaging-display:19.0.2'
        implementation 'com.android.support:multidex:1.0.3'
        testImplementation 'junit:junit:4.12'
        androidTestImplementation 'androidx.test.ext:junit:1.1.0'
        androidTestImplementation 'androidx.test.espresso:espresso-core:3.1.1'
        implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
    }
    apply plugin: 'com.google.gms.google-services'
    

    “onMessageReceived”中存在空引用错误

    您正在调用该消息的特定属性,这些属性试图从空值中提取数据:

    .setContentTitle(remoteMessage.getNotification().getTitle())
    

    作为remoteMessage变量传入的任何内容都显示为null。你应该从那里开始,看看你在传递什么。

    你在“onMessageReceived”中有一个空引用错误

    您正在调用该消息的特定属性,这些属性试图从空值中提取数据:

    .setContentTitle(remoteMessage.getNotification().getTitle())
    

    作为remoteMessage变量传入的任何内容都显示为null。你应该从那里开始,看看你在传递什么。

    错误消息告诉你
    消息
    为空。我不清楚FCM为什么这么做。在我看来,这就像FCM中的一个bug。现在,在调用
    getNotification()
    之前,您应该检查消息
    是否不为null,以防止应用程序崩溃


    我强烈建议并清楚地解释如何重现该问题。

    错误消息告诉您
    消息
    为空。我不清楚FCM为什么这么做。在我看来,这就像FCM中的一个bug。现在,在调用
    getNotification()
    之前,您应该检查消息
    是否不为null,以防止应用程序崩溃


    我强烈建议并清楚地解释如何重现该问题。

    MyFirebaseMessagingService.java:21
    MyFirebaseMessagingService.java的第21行在哪里?@code peedient.setContentTitle(remoteMessage.getNotification().getTitle()),其中发生了空异常。似乎是“getNotification()”调用导致了错误。看起来remoteMessage为空。@Code Peedient.setContentTitle(remoteMessage.getNotification().getTitle())MyFirebaseMessagingService.java:21MyFirebaseMessagingService.java的第21行在哪里?@Code Peedient.setContentTitle(remoteMessage.getNotification().getTitle()),其中发生了空异常。似乎是“getNotification()”调用导致了错误。看起来remoteMessage为空。@Code Peedient.setContentTitle(remoteMessage.getNotification().getTitle())显然,在onMessageReceived方法上使用“throws NullPointerException”解决了崩溃问题,但通知没有到达应用程序。Android Studio建议使用方法.getTitle()和.notify()在MyFirebaseMessagingService.java中,可能会生成NullPointerException,但我不知道为什么OP不向onMessageReceived传递任何内容。这是FCM框架调用的回调。它看起来像是FCM的一个bug,因为它正在向应用程序发送一条null
    消息
    。显然,通过在onMessageReceived方法上使用“throws NullPointerException”解决了崩溃问题,但通知没有到达应用程序。Android Studio建议使用方法.getTitle()和.notify()在MyFirebaseMessagingService.java中,可能会生成NullPointerException,但我不知道为什么OP不向onMessageReceived传递任何内容。这是FCM框架调用的回调。它看起来像是FCM的一个bug,因为它向应用程序发送了一条空的
    消息。
    
    .setContentTitle(remoteMessage.getNotification().getTitle())