2016-06-14 80 views
5

Ho sviluppato un'applicazione Android. Ho usato Firebase per la notifica. Ho letto la documentazione di Firebase e poi li ho creati rispettivamente. Potrei inviare una notifica push a un dispositivo utilizzando il token InstanceID. Ma non potevo inviare notifiche push a tutti i dispositivi. Mi aiuti per favore.Notifica push Firebase non funzionante

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

Puoi pubblicare il tuo manifest anche –

+0

Ho aggiornato la mia domanda. –

+0

Se si sta utilizzando l'esempio direttamente, non funzionerà. Perché quell'esempio funzioni prima devi registrarti con la console FCM. Crea un progetto, fornisci il file google-services.json nella cartella app/android. –

risposta

5

si dovrebbe includere premission sul manifesto:

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

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

Aggiornamento

No premission sono necessari più, perché "tutte le autorizzazioni necessarie da FCM sono ora aggiunti automaticamente dalla libreria"

+0

Come lo cambi? i cambiamenti manifest in ogni compilation, non so come salvare quei cambiamenti. Grazie. –

+1

@KRist Non riesco a vedere nulla nei documenti che specificano che queste autorizzazioni sono richieste? – StuStirling

+0

@KRist questo non è più necessario. Vedi guida alla migrazione: https://developers.google.com/cloud-messaging/android/android-migrate-fcm – ADev

0

Go Per https://console.firebase.google.com/ vai al menu Notifiche. qui puoi inviare messaggi direttamente a qualsiasi dispositivo specifico o a tutti i dispositivi o in base all'argomento che il tuo cliente ha sottoscritto.

+0

voglio inviare un messaggio con l'aiuto di php scrivo un codice sfortunatamente non andando al dispositivo –

0

Ho provato tutte le soluzioni pubblicate qui e in altri post ma non hanno funzionato per me. Ho risolto manualmente disinstallando e reinstallando l'app sul mio dispositivo. Spero che questo aiuto.

0

e non dimenticare, Ho avuto lo stesso problema e si è risolto con definizione degli abilitati, esportati in vero nel mio servizio, cercando di fare come me, ..

<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

Invece di "Invia ora" nelle notifiche della console Web di Firebase, prova a "Invia più tardi" con un tempo a breve in futuro. Invia ora potrebbe presentare un bug in cui la data viene inviata leggermente in passato, quindi non viene mai inviata.