2016-06-14 156 views
5

我开发了一个android应用程序。我使用firebase进行通知。我读了firebase文档,然后分别制作了它们。我可以使用InstanceID令牌将推送通知发送到一台设备。但我无法将推送通知发送到所有设备。请帮帮我。Firebase推送通知不起作用

MyFirebaseMessagingService.java

public class MyFirebaseMessagingService extends FirebaseMessagingService { 

    private static final String TAG = "MyFirebaseMsgService"; 

    /** 
    * Called when message is received. 
    * 
    * @param remoteMessage Object representing the message received from Firebase Cloud Messaging. 
    */ 
    // [START receive_message] 
    @Override 
    public void onMessageReceived(RemoteMessage remoteMessage) { 
     // TODO(developer): Handle FCM messages here. 
     // If the application is in the foreground handle both data and notification messages here. 
     // Also if you intend on generating your own notifications as a result of a received FCM 
     // message, here is where that should be initiated. See sendNotification method below. 
     Log.d(TAG, "From: " + remoteMessage.getFrom()); 
     Log.d(TAG, "Notification Message Body: " + remoteMessage.getNotification().getBody()); 
    } 
    // [END receive_message] 

    /** 
    * Create and show a simple notification containing the received FCM message. 
    * 
    * @param messageBody FCM message body received. 
    */ 
    private void sendNotification(String messageBody) { 
     Intent intent = new Intent(this, MainActivity.class); 
     intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 
     PendingIntent pendingIntent = PendingIntent.getActivity(this, 0 /* Request code */, intent, 
       PendingIntent.FLAG_ONE_SHOT); 

     Uri defaultSoundUri= RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION); 
     NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(this) 
       .setSmallIcon(R.drawable.ic_stat_ic_notification) 
       .setContentTitle("FCM Message") 
       .setContentText(messageBody) 
       .setAutoCancel(true) 
       .setSound(defaultSoundUri) 
       .setContentIntent(pendingIntent); 

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

     notificationManager.notify(0 /* ID of notification */, notificationBuilder.build()); 
    } 
} 

MyFirebaseInstanceIDService.java

public class MyFirebaseInstanceIDService extends FirebaseInstanceIdService { 

    private static final String TAG = "MyFirebaseIIDService"; 

    /** 
    * Called if InstanceID token is updated. This may occur if the security of 
    * the previous token had been compromised. Note that this is called when the InstanceID token 
    * is initially generated so this is where you would retrieve the token. 
    */ 
    // [START refresh_token] 
    @Override 
    public void onTokenRefresh() { 
     // Get updated InstanceID token. 
     String refreshedToken = FirebaseInstanceId.getInstance().getToken(); 
     Log.d(TAG, "Refreshed token: " + refreshedToken); 

     // TODO: Implement this method to send any registration to your app's servers. 
     sendRegistrationToServer(refreshedToken); 
    } 
    // [END refresh_token] 

    /** 
    * Persist token to third-party servers. 
    * 
    * Modify this method to associate the user's FCM InstanceID token with any server-side account 
    * maintained by your application. 
    * 
    * @param token The new token. 
    */ 
    private void sendRegistrationToServer(String token) { 
     // Add custom implementation, as needed. 
    } 
} 

MainActivity.java

public class MainActivity extends AppCompatActivity { 

    private static final String TAG = "MainActivity"; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     if (getIntent().getExtras() != null) { 
      for (String key : getIntent().getExtras().keySet()) { 
       String value = getIntent().getExtras().getString(key); 
       Log.d(TAG, "Key: " + key + " Value: " + value); 
      } 
     } 

     Button subscribeButton = (Button) findViewById(R.id.subscribeButton); 
     subscribeButton.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       // [START subscribe_topics] 
       FirebaseMessaging.getInstance().subscribeToTopic("news"); 
       Log.d(TAG, "Subscribed to news topic"); 
       // [END subscribe_topics] 
      } 
     }); 

     Button logTokenButton = (Button) findViewById(R.id.logTokenButton); 
     logTokenButton.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       Log.d(TAG, "InstanceID token: " + FirebaseInstanceId.getInstance().getToken()); 
      } 
     }); 
    } 

} 

的Manifest.xml

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

    <application 
     android:allowBackup="true" 
     android:icon="@mipmap/ic_launcher" 
     android:label="@string/app_name" 
     android:supportsRtl="true" 
     android:theme="@style/AppTheme"> 
     <activity android:name=".MainActivity"> 
      <intent-filter> 
       <action android:name="android.intent.action.MAIN" /> 

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

     <service 
      android:name=".MyFirebaseMessagingService"> 
      <intent-filter> 
       <action android:name="com.google.firebase.MESSAGING_EVENT"/> 
      </intent-filter> 
     </service> 

     <service 
      android:name=".MyFirebaseInstanceIDService"> 
      <intent-filter> 
       <action android:name="com.google.firebase.INSTANCE_ID_EVENT"/> 
      </intent-filter> 
     </service> 

    </application> 

</manifest> 
+0

你也可以发布你的清单 –

+0

我更新了我的问题。 –

+0

如果您直接使用示例,它将无法工作。对于这个例子,首先你应该注册FCM控制台。创建一个项目,在app/android文件夹中提供google-services.json文件。 –

回答

5

你应该包括清单premission:

<uses-permission android:name="com.google.android.c2dm.permission.RECEIVE"/> 

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

更新

没有premission都不再需要,因为

+0

你如何改变这种情况?清单在每个汇编中都会发生变化,我不知道如何保存这些更改。谢谢。 –

+1

@KRist我看不到指定需要这些权限的文档中的任何内容? – StuStirling

+0

@KRist这不再需要。请参阅迁移指南:https://developers.google.com/cloud-messaging/android/android-migrate-fcm – ADev

0

转到 “全部由FCM所需要的权限,现在由库自动添加”致https://console.firebase.google.com/转到菜单通知。在这里您可以将消息直接发送到任何特定设备或所有设备,或者根据客户订阅的主题发送消息。

+0

我想发送消息与PHP的帮助,我写了一个代码,不幸的是没有去设备 –

0

我试过所有的解决办法张贴在这里和其他职位,但他们没有为我工作。我通过在我的设备上手动卸载并重新安装应用程序来解决问题。希望这个帮助。

0

不要忘记, 我有同样的问题,它是通过定义启用,出口到真正的在我的服务,努力做到像我解决了,..

<service android:name=".MyFirebaseMessagingService" 
      android:enabled="true" 
      android:exported="true"> 
      <intent-filter> 
       <action android:name="com.google.firebase.MESSAGING_EVENT"/> 
      </intent-filter> 
     </service> 
</application> 
0

而不是“立即发送”在firebase Web控制台通知GUI中,稍后将尝试“稍后发送”一段时间。现在发送可能会有一个错误,它会将日期稍微发送一次,以免发送。