2012-09-24 23 views
13

Z tego samouczka: push notification in android app opracowałem aplikację powiadomień push w numerze Android. Przycisk rejestru jest wyświetlany po uruchomieniu aplikacji. Kiedy klikam przycisk rejestru, a kiedy rejestracja się powiedzie, na moim urządzeniu wyświetla się powiadomienie.Jak dodać powiadomienie push w mojej własnej aplikacji na Androida

Jak mogę uwzględnić to we własnej aplikacji? Moja aplikacja ma jedną przykładową aplikację do analizy XML. Tutaj, gdy dodawany jest nowy element, chcę wyświetlić (nowe zamówienie zostanie wyświetlone) wiadomość z powiadomieniem na urządzeniu. Jest automatycznie generowany tutaj.

+2

C2DM jest przestarzała. Proszę użyć https://developer.android.com/guide/google/gcm/index.html – gigadot

+0

ok, spróbuję nauczyć się i rozwijać powyższy tutorial – user1676640

+1

wygląd mojej odpowiedzi tutaj: mam nadzieję, że pomoże: http: // stackoverflow. com/a/12437549/554740 – HelmiB

Odpowiedz

17

Zamieszczam aplikację demo pod numerem Google Cloud Messaging.

Upewnij się stworzyć aplikację demo z poziomu API równej lub wyższej niż Android OS 2.2 z Google API

Użytkownik ma do podpisanej w przy-najmniej jedno konto Google, aby korzystać z tej usługi.

Najpierw musisz dodać GCM library.

niż tworzyć od klasy, które nazwałem GCMIntentService która rozciąga GCMBaseIntentService następująco:

package com.example.gcmdemo; 

import android.content.Context; 
import android.content.Intent; 
import android.util.Log; 

import com.google.android.gcm.GCMBaseIntentService; 
import com.google.android.gcm.GCMConstants; 

public class GCMIntentService extends GCMBaseIntentService { 

    private static final String TAG = "Push Notification Demo GCMIntentService"; 

    @Override 
    protected void onError(Context context, String errorId) { 

     if(GCMConstants.ERROR_ACCOUNT_MISSING.equalsIgnoreCase(errorId)) { 
      Log.v(TAG, "Error Account Missing"); 
     } else if(GCMConstants.ERROR_AUTHENTICATION_FAILED.equalsIgnoreCase(errorId)) { 
      Log.v(TAG, "Error Authentication Failed"); 
     } else if(GCMConstants.ERROR_INVALID_PARAMETERS.equalsIgnoreCase(errorId)) { 
      Log.v(TAG, "Error Invalid Parameters"); 
     } else if(GCMConstants.ERROR_INVALID_SENDER.equalsIgnoreCase(errorId)) { 
      Log.v(TAG, "Error Invalid Sender"); 
     } else if(GCMConstants.ERROR_PHONE_REGISTRATION_ERROR.equalsIgnoreCase(errorId)) { 
      Log.v(TAG, "Error Phone Registration Error"); 
     } else if(GCMConstants.ERROR_SERVICE_NOT_AVAILABLE.equalsIgnoreCase(errorId)) { 
      Log.v(TAG, "Error Service Not Available"); 
     } 
    } 

    @Override 
    protected void onMessage(Context context, Intent intent) { 

     // App Server Sends message as key value pairs 
     String value1 = intent.getStringExtra("key1"); 
     String value2 = intent.getStringExtra("key2"); 

     Log.v(TAG, "key1: "+value1); 
     Log.v(TAG, "key2: "+value2); 
    } 

    @Override 
    protected void onRegistered(Context context, String regId) { 

     Log.v(TAG, "Successfull Registration : "+regId); 
    } 

    @Override 
    protected void onUnregistered(Context context, String regId) { 

     Log.v(TAG, "Successfully Unregistred : "+regId); 
    } 

    @Override 
    protected String[] getSenderIds(Context context) { 
     return super.getSenderIds(context); 
    } 

    @Override 
    protected void onDeletedMessages(Context context, int total) { 
     super.onDeletedMessages(context, total); 
    } 

    @Override 
    protected boolean onRecoverableError(Context context, String errorId) { 
     return super.onRecoverableError(context, errorId); 
    } 
} 

Oto jak należy sprawdzić rejestrację w następujących aktywności demo:

package com.example.gcmdemo; 

import android.app.Activity; 
import android.os.Bundle; 
import android.util.Log; 
import android.view.Menu; 

import com.google.android.gcm.GCMRegistrar; 

public class MainActivity extends Activity { 

    private static final String TAG = "Push Notification Demo Activity"; 
    private static final String SENDER_ID = "1069713227710"; 

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

     GCMRegistrar.checkDevice(this); 
     GCMRegistrar.checkManifest(this); 
     final String regId = GCMRegistrar.getRegistrationId(this); 
     if (regId.equals("")) { 
      GCMRegistrar.register(this, SENDER_ID); 
     } else { 
      Log.v(TAG, "Already registered : "+regId); 
     } 
    } 

    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     getMenuInflater().inflate(R.menu.activity_main, menu); 
     return true; 
    } 
} 

i wreszcie manifeście demo:

<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
    package="com.example.gcmdemo" 
    android:versionCode="1" 
    android:versionName="1.0" > 

    <uses-sdk 
     android:minSdkVersion="8" 
     android:targetSdkVersion="8" /> 

    <permission 
     android:name="com.example.gcmdemo.permission.C2D_MESSAGE" 
     android:protectionLevel="signature" /> 

    <uses-permission android:name="com.example.gcmdemo.permission.C2D_MESSAGE" /> 

    <!-- App receives GCM messages. --> 
    <uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" /> 
    <!-- GCM connects to Google Services. --> 
    <uses-permission android:name="android.permission.INTERNET" /> 
    <!-- GCM requires a Google account. --> 
    <uses-permission android:name="android.permission.GET_ACCOUNTS" /> 
    <!-- Keeps the processor from sleeping when a message is received. --> 
    <uses-permission android:name="android.permission.WAKE_LOCK" /> 

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

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

     <receiver 
      android:name="com.google.android.gcm.GCMBroadcastReceiver" 
      android:permission="com.google.android.c2dm.permission.SEND" > 
      <intent-filter> 
       <action android:name="com.google.android.c2dm.intent.RECEIVE" /> 
       <action android:name="com.google.android.c2dm.intent.REGISTRATION" /> 

       <category android:name="com.example.gcmdemo" /> 
      </intent-filter> 
     </receiver> 

     <service android:name=".GCMIntentService" /> 
    </application> 

</manifest> 

Również będziesz n eed third party server side script as specified here.

+0

ya zrobiłem powyższe metody. Aplikacja pomyślnie uruchomiła i wyświetliła listview.i musiała wstawić jeden element na mojej bazie danych z powodzeniem, po tym jak pójdę i zobaczę moje urządzenie, na moim urządzeniu nie wyświetla się komunikat z powiadomieniem. – user1676640

+0

ograniczyć liczbę powiadomień o wypychaniu w GCM? –

2

osobiście sugerują, że zamiast GCM istnieje również inna biblioteka o nazwie Parse dla PushNotification, to działa tak samo jak Google Cloud Messaging, ale to jest tak tak tak tak łatwo wtedy GCM

Trzeba tylko pobrać plik JAR i proste dwa-trzy linia kodu do push-ZGŁOSZENIA

nauczyć się korzystać z tej strony https://parse.com/tutorials/android-push-notifications

Nawet nie trzeba korzystać z PHP lub jakiegokolwiek kodu po stronie serwera to zapewnić Państwu zakład

spojrzenie dam u demo

Parse.initialize(this, "YOUR_APP_ID", "YOUR_CLIENT_KEY"); 
    PushService.setDefaultPushCallback(this, YourDefaultActivity.class); 

z wyżej kod jest na tyle otrzymaniu powiadomienia Push

jeśli chcesz powiadomienia wysyłania zapewniają ładne UI wyglądać obraz UI one zapewnić

enter image description here

+1

Parse jest ofertą komercyjną. Czy GCM ma podobne ograniczenia (cenę) po określonym limicie? Przetwarzanie –

+0

jest komercyjne tylko w modelu SaaS. mają także wersję open source swojego serwera na github – kacper3w

2

Wysyłanie powiadomienia push przy użyciu FCM

Google przestarzałe Google Cloud Messaging (GCM) i uruchomiła nowy serwer powiadomień push, który jest Firebase Cloud Messaging (FCM). FCM jest taka sama jak GCM, FCM jest wieloplatformowym rozwiązaniem komunikacyjnym dla platform mobilnych

Firebase Cloud Messaging może wysłać trzy rodzaje komunikatów (Message types)

1.Notification wiadomość

2.Data Wiadomość

3.message zarówno notyfikacji i dane

Firebase Cloud Messaging Integracja kroki: -

1.USTAW.ODBIÓR Nowy projekt lub projekt importu w Firbase Console (https://firebase.google.com/)

2.Dodaj zdjęcia tego samego pakietu Nazwa Aplikacja w aplikacji Firebase.

3. Pobierz plik "google-services.json" i umieść go w folderze aplikacji projektu. Ten plik zawiera wszystkie adresy URL i klucze usługi Google, więc nie zmieniaj ani nie edytuj tego pliku.

4. Dodaj nowe zależności Gradle w Project for Firebase.

//app/build.gradle 
dependencies { 
    compile 'com.google.firebase:firebase-messaging:9.6.0' 
} 

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

5. Utwórz klasę zawierającą wszystkie wartości stałe, których używamy w aplikacji dla FCM.

public class Config { 
public static final String TOPIC_GLOBAL = "global"; 
// broadcast receiver intent filters 
public static final String REGISTRATION_COMPLETE = "registrationComplete"; 
public static final String PUSH_NOTIFICATION = "pushNotification"; 

// id to handle the notification in the notification tray 
public static final int NOTIFICATION_ID = 100; 
public static final int NOTIFICATION_ID_BIG_IMAGE = 101; 
public static final String SHARED_PREF = "ah_firebase"; 
} 

6. utworzyć klasę o nazwie MyFirebaseInstanceIDService.java które będą odbiera Firebase identyfikator rejestracji, który będzie unikalny dla każdej aplikacji. Identyfikator rejestracji służy do wysyłania wiadomości do jednego urządzenia.

public class MyFirebaseInstanceIDService extends FirebaseInstanceIdService { 
    private static final String TAG = MyFirebaseInstanceIDService.class.getSimpleName(); 

    @Override 
    public void onTokenRefresh() { 
     super.onTokenRefresh(); 
     String refreshedToken = FirebaseInstanceId.getInstance().getToken(); 

     // Saving reg id to shared preferences 
     storeRegIdInPref(refreshedToken); 

     // sending reg id to your server 
     sendRegistrationToServer(refreshedToken); 

     // Notify UI that registration has completed, so the progress indicator can be hidden. 
     Intent registrationComplete = new Intent(Config.REGISTRATION_COMPLETE); 
     registrationComplete.putExtra("token", refreshedToken); 
     LocalBroadcastManager.getInstance(this).sendBroadcast(registrationComplete); 
    } 

    private void sendRegistrationToServer(final String token) { 
     // sending gcm token to server 
     Log.e(TAG, "sendRegistrationToServer: " + token); 
    } 

    private void storeRegIdInPref(String token) { 
    SharedPreferences pref =  getApplicationContext().getSharedPreferences(Config.SHARED_PREF, 0); 
     SharedPreferences.Editor editor = pref.edit(); 
     editor.putString("regId", token); 
     editor.commit(); 
    } 
    } 

7.Create jedna klasa usługa o nazwie MyFirebaseMessagingService.java. To spowoduje otrzymanie wiadomości z bazy FireFase.

public class MyFirebaseMessagingService extends FirebaseMessagingService { 

    private static final String TAG = MyFirebaseMessagingService.class.getSimpleName(); 

    private NotificationUtils notificationUtils; 

    @Override 
    public void onMessageReceived(RemoteMessage remoteMessage) { 
     Log.e(TAG, "From: " + remoteMessage.getFrom()); 

     if (remoteMessage == null) 
      return; 

     // Check if message contains a notification payload. 
     if (remoteMessage.getNotification() != null) { 
      Log.e(TAG, "Notification Body: " + remoteMessage.getNotification().getBody()); 
      handleNotification(remoteMessage.getNotification().getBody()); 
     } 
    } 
private void handleNotification(String message) { 
     if (!NotificationUtils.isAppIsInBackground(getApplicationContext())) { 
      // app is in foreground, broadcast the push message 
      Intent pushNotification = new Intent(Config.PUSH_NOTIFICATION); 
      pushNotification.putExtra("message", message); 
      LocalBroadcastManager.getInstance(this).sendBroadcast(pushNotification); 

      // play notification sound 
      NotificationUtils notificationUtils = new NotificationUtils(getApplicationContext()); 
      notificationUtils.playNotificationSound(); 
     }else{ 
      // If the app is in background, firebase itself handles the notification 
     } 
    } 
/** 
    * Showing notification with text only 
    */ 
    private void showNotificationMessage(Context context, String title, String message, String timeStamp, Intent intent) { 
     notificationUtils = new NotificationUtils(context); 
     intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK); 
     notificationUtils.showNotificationMessage(title, message, timeStamp, intent); 
    } 

    /** 
    * Showing notification with text and image 
    */ 
    private void showNotificationMessageWithBigImage(Context context, String title, String message, String timeStamp, Intent intent, String imageUrl) { 
     notificationUtils = new NotificationUtils(context); 
     intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK); 
     notificationUtils.showNotificationMessage(title, message, timeStamp, intent, imageUrl); 
    } 
} 

8.In na AndroidManifest.xml dodać te dwie usługi Firebase MyFirebaseMessagingService i MyFirebaseInstanceIDService.

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

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

Teraz wystarczy Send your First Message

Uwagi:

* 1.Read Google Doc do Firebase Cloud Messaging *

2.Jeżeli chcesz migrować Aplikacja klienta GCM dla systemu Android na platformę Fir ebase Cloud Messaging następujące kroki i DOC (Migrate a GCM Client App)

3.Android samouczek Sample i kod (Receive Reengagement Notifications)

Powiązane problemy