onMessageRecieved从未触发过Firebase通知

时间:2017-02-17 20:06:42

标签: android firebase firebase-cloud-messaging

我的MessageRecieved方法永远不会在我的Android应用程序中被触发,尽管该服务正在运行并且清单似乎没问题。我们正在通过firebase控制台发送消息,似乎没有任何事情发生。此外,onToken刷新方法只被调用一次,这是您第一次安装应用程序时。在那之后,它永远不会被调用。我已经在前台和后台测试了应用程序,但仍未调用onMessageRecieve方法。

这是我的清单

        <?xml version="1.0" encoding="utf-8"?>
    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        package="com.example.beatrice.mylocalbartender">

        <application
            android:allowBackup="true"
            android:icon="@mipmap/ic_launcher"
            android:label="@string/app_name"
            android:supportsRtl="true"
            android:theme="@style/AppTheme"
            tools:node="replace"
            tools:replace="android:supportsRtl">

            <!-- meta data to connect ot the facebook api -->

            <service
                android:enabled="true"
                android:exported="true"
                android:name=".messaging.MyFirebaseInstanceIdService">
                <intent-filter>
                    <action android:name="com.google.firebase.INSTANCE_ID_EVENT"/>
                </intent-filter>
            </service>

            <service
                android:enabled="true"
                android:exported="true"
                android:name=".messaging.MyFirebaseMessagingService">
                <intent-filter>
                    <action android:name="com.google.firebase.MESSAGING_
    EVENT"/>
                </intent-filter>
            </service>


            <meta-data
                android:name="com.google.firebase.messaging.default_notification_icon"
                android:resource="@drawable/bt_ic_android_pay" />
            <!-- Set color used with incoming notification messages. This is used when no color is set for the incoming
                 notification message.  for more. -->
            <meta-data
                android:name="com.google.firebase.messaging.default_notification_color"
                android:resource="@color/colorAccent" />


            <meta-data android:name="com.facebook.sdk.ApplicationId" android:value="@string/facebook_app_id"/>
            <meta-data android:name="com.google.android.gms.wallet.api.enabled" android:value="true"/>
            <meta-data android:name="com.google.android.gms.version" android:value="@integer/google_play_services_version" />




            <uses-permission android:name="android.permission.INTERNET" />

            <activity android:name=".messaging.MainActivity"></activity>
            <activity android:name=".activity.GmailSignInActivity">

            </activity>

            <activity android:name=".activity.MainActivity">

                <intent-filter>
                    <action android:name="android.intent.action.MAIN" />

                    <category android:name="android.intent.category.LAUNCHER" />
                </intent-filter>

            </activity>

            <!-- activity for brain tree, please do not touch -->
            <activity
                android:name="com.braintreepayments.api.BraintreeBrowserSwitchActivity"
                android:launchMode="singleTask">
                <intent-filter>
                    <action android:name="android.intent.action.VIEW" />

                    <category android:name="android.intent.category.DEFAULT" />
                    <category android:name="android.intent.category.BROWSABLE" />

                    <data android:scheme="${applicationId}.braintree" />
                </intent-filter>
            </activity>

            <!-- This activity will be removed in the future -->

            <activity
                android:name=".activity.FacebookLogInActivity"
                android:label="@string/title_activity_facebook_log_in"
                android:theme="@style/AppTheme.NoActionBar">

            </activity>


            <!-- to launch facebook activity - please do not touch -->

            <activity android:name="com.facebook.FacebookActivity"
                android:configChanges="keyboard|keyboardHidden|screenLayout|screenSize|orientation"
                android:theme="@android:style/Theme.Translucent.NoTitleBar"
                android:label="@string/app_name" />

            <activity enter code hereandroid:name="com.braintreepayments.api.dropin.DropInActivity"></activity>
            <activity android:name="com.braintreepayments.api.dropin.AddCardActivity"></activity>



        </application>

    </manifest>

正如您所看到的那样,服务已启用并已导出。  这是服务

public class MyFirebaseInstanceIdService extends FirebaseInstanceIdService {

    private static final String TAG = "MyFirebaseIIDService";
    private static final String FRIENDLY_ENGAGE_TOPIC = "friendly_engage";

    /**
     * The Application's current Instance ID token is no longer valid
     * and thus a new one must be requested.
     */

    public MyFirebaseInstanceIdService(){
        super();
        Log.d("startedServiceNoLie","hiiiiiiiiiiiiiiiiiiiii");
    }


    @Override
    public void onTokenRefresh() {
        // If you need to handle the generation of a token, initially or
        // after a refresh this is where you should do that.
        String token = FirebaseInstanceId.getInstance().getToken();

        Log.d(TAG, "FCM Token: " + token);
    }
}

这是FirebaseMessagingService

public class MyFirebaseMessagingService extends FirebaseMessagingService {

    private static final String TAG = "MyFMService";

    public MyFirebaseMessagingService() {
        super();
        Log.d("startedMessageRecieved","messagingService");

    }

    @Override
    public void onMessageReceived(RemoteMessage remoteMessage) {
        // Handle data payload of FCM messages.
        Log.d("messageRecieved", "FCM Message Id: " + remoteMessage.getMessageId());
        Log.d("messageRecieved", "FCM Notification Message: " +
                remoteMessage.getNotification());
        Log.d("messageRecieved", "FCM Data Message: " + remoteMessage.getData());
    }
}

这是从

调用两个服务的活动
    public class MainActivity extends AppCompatActivity {

    Button launch_msg_app;
   // private static DatabaseReference root = FirebaseDatabase.getInstance().getReference();

    @Override
    protected void onCreate(Bundle savedInstanceState) {

        FirebaseApp.initializeApp(this);
        super.onCreate(savedInstanceState);
        setContentView(R.layout.deletethislayout);

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

        Log.d("tokenNotRefresh",FirebaseInstanceId.getInstance().getToken());
        startService(intent);


        startService(new Intent(this, MyFirebaseMessagingService.class));

        //startService(new Intent(this, DeleteService.class));
    }

这是我的项目。 gradle这个

buildscript {
    repositories {
        jcenter()
        maven { url 'https://maven.fabric.io/public' }
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:2.2.3'
        classpath 'com.google.gms:google-services:3.0.0'
        // NOTE: Do not place your application dependencies here; they belong
        // in the individual module build.gradle files
    }
}

allprojects {
    repositories {
        jcenter()
        mavenLocal()
        maven {
            url 'https://maven.fabric.io/public'
        }
    }
}

task clean(type: Delete) {
    delete rootProject.buildDir
}

这是我的应用.gradle

    apply plugin: 'com.android.application'

    repositories {
        mavenLocal()
        flatDir {
            dirs 'libs'
        }
    }
    android {
        compileSdkVersion 25
        buildToolsVersion "25.0.2"

        defaultConfig {
            applicationId "com.example.beatrice.mylocalbartender"
            minSdkVersion 16
            targetSdkVersion 25
            versionCode 1
            versionName "1.0"
            testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
        }
        buildTypes {
            release {
                minifyEnabled false
                proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
            }
        }
    }


    dependencies {
        compile fileTree(dir: 'libs', include: ['*.jar'])
        testCompile 'junit:junit:4.12'
        compile 'com.google.android.gms:play-services:10.2.0'

        compile 'com.android.support:design:25.0.0'
        compile 'com.github.bumptech.glide:glide:3.6.1'
        compile 'de.hdodenhof:circleimageview:1.3.0'
        compile 'com.android.support:appcompat-v7:25.0.0'

        // Google
        compile 'com.google.android.gms:play-services-auth:10.2.0'

        // Firebase
        compile 'com.google.firebase:firebase-core:10.2.0'
        compile 'com.google.firebase:firebase-messaging:10.2.0'
        compile 'com.google.firebase:firebase-database:10.0.0'
        compile 'com.google.firebase:firebase-auth:10.0.0'
        compile 'com.google.firebase:firebase-config:10.0.0'
        compile 'com.google.android.gms:play-services-appinvite:10.2.0'
        compile 'com.google.android.gms:play-services-ads:10.2.0'
        compile 'com.google.firebase:firebase-crash:10.0.0'
        compile 'com.google.firebase:firebase-appindexing:10.0.0'

        // Payments
        compile 'com.firebaseui:firebase-ui-database:0.4.0'
        compile 'com.braintreepayments.api:drop-in:3.+'
        compile 'com.loopj.android:android-async-http:1.4.9'
        compile 'com.google.android.gms:play-services-auth:10.2.0'
        compile 'com.facebook.android:facebook-android-sdk:4.+'
        compile 'com.google.android.gms:play-services-wallet:10.2.0'
        compile 'com.firebase:geofire-android:2.1.1'

    }

apply plugin: 'com.google.gms.google-services'

这让我们发疯,我不知道为什么它没有收到消息。我们再次从firebase通知控制台发送消息。我们向整个应用程序发送了一条消息,它仍然没有做任何事情。请帮助我们。非常感谢。

5 个答案:

答案 0 :(得分:1)

我还不能发表评论:

我不太确定“android-enabled”和“android-exported”标签在清单中的服务声明中的意思和作用。无论如何,即使没有这些标签,它也适用于我。

My MessagingService看起来有点不同:

构造函数为空(甚至不调用super(...))。  但我打电话给

super.onMessageReceived(remoteMessage);

在我的onMessageReceived方法中。

尝试将其添加到onMessageReceived方法中:)

编辑: 我只使用2个权限来覆盖“请勿打扰”模式,并在设备启动完成后启动服务。

我的清单看起来像这样(只是FCM部分):

<application>
<service android:name=".MyAppFirebaseService">
        <intent-filter>
            <action android:name="com.google.firebase.MESSAGING_EVENT" />
        </intent-filter>
</service>
<service android:name=".MyApp_FirebaseInstanceIdService">
        <intent-filter>
            <action android:name="com.google.firebase.INSTANCE_ID_EVENT" />
        </intent-filter>
</service>

我的服务如下:

public class MyAppFirebaseService extends FirebaseMessagingService {

    public MyAppFirebaseService() {

    }

    @Override
    public void onMessageReceived(RemoteMessage remoteMessage) {
        // ...
        super.onMessageReceived(remoteMessage);
        String title = "Title";
        String message = "Message";


        // Check if message contains a data payload.
        if (remoteMessage.getData().size() > 0) {
            title = remoteMessage.getData().get("title");
            message = remoteMessage.getData().get("body");
        }

        // Check if message contains a notification payload.
        if (remoteMessage.getNotification() != null) {
            title = remoteMessage.getNotification().getTitle();
            message = remoteMessage.getNotification().getBody();
        }
        //My method to display (create) the notification
        //Basically contains a notification(compat)builder
        displayNotifcation(title, message);

    }
}

要了解通知构建器的工作方式,请阅读本文档: Android Developer Notification.Builder

答案 1 :(得分:1)

尝试从onCreate中删除Firebase.initializeApp(this) 。这是不必要的,可能是问题

答案 2 :(得分:0)

发送消息时,您必须使用某个命名频道,并且应使用subscribeOnTopic(“tome_topic”)在此频道上订阅您的应用。

例如,对于频道“新闻”,您将向“/ topics / news”频道发送消息,并且您的应用必须在此频道上订阅才能接收消息:

FirebaseMessaging.getInstance().subscribeOnTopic("news");

只需将其添加到onTokenRefresh()回调或调用所需的位置即可。

如果您不想接收来自“新闻”频道的消息,请使用     。FirebaseMessaging.getInstance()unsubscribeFromTopic( “新闻”);

请注意,从您的应用服务器发送时,您应该使用“/ topics / news”作为频道名称,但在您的应用中,您只使用“新闻”。

关于只有一个onTokenRefresh()调用 - 确定每次重启应用程序都没有调用它。 firebase客户端库在重新启动之间存储令牌,并且仅在需要时才刷新。

答案 3 :(得分:0)

从清单文件中删除工具:node =“replace”。

答案 4 :(得分:0)

I struggled with same issue 5days, code everything fine but firebase registrationnid not generating Notifications iam not receiving from firbase console, Finally i got solution

   <application
            android:allowBackup="true"
            android:icon="@mipmap/ic_launcher"
            android:label="@string/app_name"
            android:supportsRtl="true"
            android:theme="@style/AppTheme"
            tools:node="replace"
            tools:replace="android:supportsRtl">

Everything happend because of this Line inside Application tag      tools:node="replace"
Please remove this line it will work Perfectly sorry for my english.