2017-02-17 69 views
1

我的MessageRecieved方法永遠不會在我的Android應用程序中被解僱,儘管服務正在運行並且清單似乎沒有問題。我們通過Firebase控制檯發送消息,似乎沒有任何事情發生。此外,onToken刷新方法只會被調用一次,這是您第一次安裝應用程序時。之後,它永遠不會被調用。我已經在前臺和後臺測試了應用程序,但仍未調用onMessageRecieve方法。onMessageRecieved從未解僱Firebase通知

這裏是我的清單

 <?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

你的項目中有'google_service.json'嗎? – WenChao

+0

是的,我喜歡。我不知道爲什麼它不起作用。我正在運行Firebase消息10.0.0。這會有所作爲嗎?在他們使用10.2.0的文檔中? –

+0

我把所有東西都更新到了10.2.0,而且什麼都沒有。我在應用程序處於前臺並且應用程序處於後臺時沒有發送消息。 –

回答

1

嘗試從onCreate 刪除Firebase.initializeApp(this)。這是不需要的,可能是問題

+0

有趣的是,我從來沒有用Firebase做過這件事,但是當我運行這個活動時。 Firebase引發了這個異常,並告訴我把它放在其他應用程序崩潰。我會看看我是否可以刪除它 –

+0

當我刪除它時,我無法獲取FirebaseInstance,因此無法獲取令牌。 Firebase將我拋出此錯誤並崩潰應用程序。 java.lang.IllegalStateException:java.lang.IllegalStateException:缺省的FirebaseApp在此進程中未初始化com.example.beatrice.mylocalbartender。確保首先調用FirebaseApp.initializeApp(Context)。 –

+0

我從來沒有使用過這個電話給我的應用程序。無論如何,您可能會發現在Firebase文檔中建議此調用來自應用程序級別,而不是來自Activity。我想可能是這樣,被你的方式調用,這可能會重新啓動你的應用程序,並駁回你之前的令牌。這只是建議 – atlascoder

1

正如我尚未對此發表評論:

我不是很確定什麼是「啓用Android的」和「Android的出口」標記的含義,並在艙單服務聲明做。無論如何,它適用於我即使沒有這些標籤。

我的MessagingService看起來有點不同:

構造函數是空的(甚至不叫超(...))。 但我打電話

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

+0

我試過了,仍然沒有。當我在模擬器上運行它時,它甚至不起作用。有沒有我缺少的某種權限? –

+0

等一下,我會將我的代碼添加到我的文章 –

+0

我添加了您的內容,但不幸的是,它仍然無法正常工作。另一個奇怪的問題是,我只能從Firebase控制檯向令牌發送一條消息。即使令牌沒有刷新,當我再次向同一令牌發送消息時,它仍然失敗。當我最初向令牌發送消息時,Firebase控制檯確實表示它已「完成」,但我顯然在我的Android應用程序上看不到任何內容 –

0

發送消息時,您必須使用某個指定頻道,並且您的應用程序應該使用sub在此頻道上訂閱scribeOnTopic( 「tome_topic」)。

在例如,對於頻道的「新聞」,你將消息發送到「/主題/新聞」頻道,你的應用程序必須以接收郵件此通道上進行訂閱:

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

剛將此添加到您的onTokenRefresh()回調或呼叫您想要的地方。

如果您不想接收來自「新聞」頻道的消息,請使用 FirebaseMessaging.getInstance()。unsubscribeFromTopic(「news」);

請注意,從應用服務器發送時,您應該爲頻道名稱使用「/ topics/news」,但在您的應用中只使用「新聞」。

關於只有一個onTokenRefresh()調用 - 它確定它不被稱爲每次重新啓動應用程序。 Firebase客戶端庫在重新啓動之間存儲令牌,並僅在需要時進行刷新。

+0

我正在嘗試向單個用戶發送消息。不是那些訂閱了主題的人。問題是,當我直接向該令牌發送消息時,Firebase控制檯會給我一個未註冊的令牌錯誤。我不明白爲什麼我會得到這個錯誤,因爲令牌沒有被刷新,所以它怎麼可以不註冊 –

+0

據我所知,令牌是由firebase雲生成的。所以我可能假設您可能使用了其他Firebase應用程序的配置文件json,或者您的令牌不存在。您可以隨時通過FirebaseInstanceId.getInstance()。getToken()檢查您的令牌狀態。 – atlascoder

+0

這是我得到令牌的方式,因爲onTokenRefresh很少會觸發。獲得該令牌後,我會轉到Firebase通知控制檯。輸入令牌併發送消息。當我第一次使用令牌時,控制檯表示它已「完成」發送消息。但是,Android應用程序沒有任何反應。即使令牌沒有刷新,並且我再次將消息發送給相同的令牌,Firebase也會拋出「未註冊的令牌」錯誤。我也嘗試通過'用戶段'向整個應用程序發送消息,但沒有任何消息。 –

0

從清單文件中刪除工具:node =「replace」。