尝试通过Firebase接收推送通知时Android App崩溃

时间:2019-12-12 21:01:51

标签: java android firebase firebase-cloud-messaging

更新:

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

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

大家好,

我正在尝试通过Firebase云消息传递服务向我的应用发送推送通知。

有两种情况。

  1. 如果我定期向所有用户发送通知,则不会发生任何事情。该应用未收到通知,但没有错误。 2.如果我使用FCM注册令牌发送测试推送通知,则应用崩溃。

这是logcat:

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();
        }
    }
}

MyFirebaseMessagingService.java

package com.maunexus;

import android.app.NotificationManager;
import android.content.Context;
import android.media.RingtoneManager;

import androidx.core.app.NotificationCompat;

import com.google.firebase.messaging.FirebaseMessagingService;
import com.google.firebase.messaging.RemoteMessage;

public class MyFirebaseMessagingService extends FirebaseMessagingService {
RemoteMessage remoteMessage;

    @Override
    public void onMessageReceived(RemoteMessage message) {
        super.onMessageReceived(remoteMessage);


        NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(this, "channel_id")
                .setContentTitle(remoteMessage.getNotification().getTitle())
                .setContentText(remoteMessage.getNotification().getBody())
                .setPriority(NotificationCompat.PRIORITY_DEFAULT)
                .setStyle(new NotificationCompat.BigTextStyle())
                .setSound(RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION))
                .setSmallIcon(R.mipmap.ic_launcher)
                .setAutoCancel(true);

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

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

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'

2 个答案:

答案 0 :(得分:0)

“ onMessageReceived”中存在空引用错误。

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)

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

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

无论您传递的是什么,remoteMessage变量似乎为null。您应该从那里开始,看看要传递的内容。

答案 1 :(得分:0)

该错误消息告诉您message为空。我不清楚为什么FCM会这样做。在我看来,这就像FCM中的错误。目前,您应该在对其上调用message之前检查getNotification()是否不为空,以防止您的应用崩溃。

我强烈建议filing a bug report with Firebase support,并明确说明如何重现此问题。