我的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通知控制台发送消息。我们向整个应用程序发送了一条消息,它仍然没有做任何事情。请帮助我们。非常感谢。
答案 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.