7

Qualcuno può aiutarmi con un esempio funzionante per ricevere messaggi da gcm utilizzando Google Cloud Messaging per Android. Ho provato entrambi i modi (libreria helper e classe GoogleCloudMessaging) e nulla sembra funzionare. Sto usando uno script PHP che mostra il seguente:Impossibile ricevere messaggi utilizzando Google Cloud Messaging per Android (non la libreria helper)

Multicast ID: 5.2108110103215E + 18 numero di messaggi elaborati con successo: 1 Numero di messaggi con errori di elaborazione: 0 ID di Canonical: 0

Così apparentemente sempre è OK. Potrei registrare il dispositivo in entrambi i modi, usando la libreria helper (gcm.jar) e usando la classe di GoogleCloudMessaging. Il problema è che non c'è modo che il messaggio che invio tramite PHP arrivi, o almeno non so come gestirlo correttamente. Qui ci sono le autorizzazioni e il ricevitore del mio manifesto:

<permission android:name="com.example.gcm.permission.C2D_MESSAGE" 
    android:protectionLevel="signature" /> 
<uses-permission android:name="com.example.gcm.permission.C2D_MESSAGE" /> 
<uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" /> 

<uses-permission android:name="android.permission.INTERNET" /> 
<uses-permission android:name="android.permission.GET_ACCOUNTS" /> 
<uses-permission android:name="android.permission.WAKE_LOCK" />  
<uses-permission android:name="android.permission.USE_CREDENTIALS" /> 
<uses-permission android:name="android.permission.READ_OWNER_DATA" /> 

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

      <!-- Receives the actual messages. --> 
      <action android:name="com.google.android.c2dm.intent.RECEIVE" /> 
      <!-- Receives the registration id. --> 
      <action android:name="com.google.android.c2dm.intent.REGISTRATION" /> 

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

ecco finalmente la classe di servizio

public class GCMIntentService extends GCMBaseIntentService { 

private static final String PROJECT_ID = "49XXXXXXXX6";  
private static final String TAG = "GCM Intent Service"; 

public GCMIntentService() 
{ 
    super(PROJECT_ID); 
    Log.d(TAG, "GCMIntentService init"); 
} 


@Override 
protected void onError(Context ctx, String sError) { 

    Log.d(TAG, "Error: " + sError);  
} 

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

    Log.d(TAG, "Message Received"); 

    String message = intent.getStringExtra("message"); 

    sendGCMIntent(ctx, message); 

} 


private void sendGCMIntent(Context ctx, String message) { 

    Intent broadcastIntent = new Intent(); 
    broadcastIntent.setAction("GCM_RECEIVED_ACTION"); 

    broadcastIntent.putExtra("gcm", message); 

    ctx.sendBroadcast(broadcastIntent); 

} 

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

    Log.d(TAG, regId); 

    // Notify main UI to update registration status 
    Intent registrationIntent = new Intent(); 
    registrationIntent.setAction("registered"); 
    registrationIntent.putExtra("regId", regId); 
    sendBroadcast(registrationIntent);  
} 

@Override 
protected void onUnregistered(Context ctx, String regId) { 
    //... 

} 
} 

ecco il codice quando si utilizza la classe GoogleCloudMessaging (ho cambiato il manifesto per utilizzare il ricevitore personalizzato):

public class GCMBroadcastReceiver extends BroadcastReceiver { 

private static final String TAG = "GCM Receiver"; 
public static final int NOTIFICATION_ID = 1; 
private NotificationManager mNotificationManager; 
private Context ctx; 

@Override 
public void onReceive(Context context, Intent intent) { 

    Log.d(TAG, "Message received"); 

    GoogleCloudMessaging gcm = GoogleCloudMessaging.getInstance(context); 
    ctx = context; 
    String messageType = gcm.getMessageType(intent); 
    if (GoogleCloudMessaging.MESSAGE_TYPE_SEND_ERROR.equals(messageType)) { 
     sendNotification("Send error: " + intent.getExtras().toString()); 
    } 
    else if (GoogleCloudMessaging.MESSAGE_TYPE_DELETED 
      .equals(messageType)) { 
     sendNotification("Deleted messages on server: " 
       + intent.getExtras().toString()); 
    } 
    else { 
     sendNotification("Received: " + intent.getExtras().toString()); 
    } 
    setResultCode(Activity.RESULT_OK); 
} 

// Put the GCM message into a notification and post it. 
private void sendNotification(String msg) { 
    mNotificationManager = (NotificationManager) ctx 
      .getSystemService(Context.NOTIFICATION_SERVICE); 

    PendingIntent contentIntent = PendingIntent.getActivity(ctx, 0, 
      new Intent(ctx, MainActivity.class), 0); 

    NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(
      ctx).setSmallIcon(R.drawable.ic_launcher_temp) 
      .setContentTitle("GCM Notification") 
      .setStyle(new NotificationCompat.BigTextStyle().bigText(msg)) 
      .setContentText(msg); 

    mBuilder.setContentIntent(contentIntent); 
    mNotificationManager.notify(NOTIFICATION_ID, mBuilder.build()); 
} 

}

La cosa è che everythin g sembra essere ok, ma il messaggio non arriva mai. Qualche idea?? Grazie in anticipo.

+0

tutorial molto bello qui http://tech-papers.org/google-cloud-messaging-gcm-for-android-and-push-notifications-2/ –

risposta

7

Aggiungere il seguente nella vostra manifeast

<permission 
    android:name="PACKAGE_NAME.permission.C2D_MESSAGE" 
    android:protectionLevel="signature" /> 

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

<!-- App receives GCM messages. --> 
<uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" /> 
+0

Scusa se hai ragione, ma è stato un problema quando ho copiato il manifest nel post. Il mio manifest ha effettivamente le autorizzazioni e ho aggiornato il post. Qualche altra idea? Grazie. –

2

Il vostro manifesto manca alcune autorizzazioni:

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

<permission android:name="com.example.gcm.permission.C2D_MESSAGE" 
    android:protectionLevel="signature" /> 
<uses-permission android:name="com.example.gcm.permission.C2D_MESSAGE" /> 

EDIT:

Nel suo manifesto si utilizza com.google.android.gcm.GCMBroadcastReceiver. Questa è una classe della vecchia libreria helper (gcm.jar) che avvia un servizio intent. Se si desidera utilizzare la libreria helper, è necessario definire il servizio intent nel manifest.

Se non si desidera utilizzare la libreria di supporto, è necessario modificare il pacchetto di GCMBroadcastReceiver nel manifest per essere il pacchetto della classe GCMBroadcastReceiver inclusa nella domanda. Altrimenti, quella classe non sarà usata.

+0

Siamo spiacenti, ma è stato un problema durante la copia il manifest al post. Il mio manifest ha effettivamente le autorizzazioni e ho aggiornato il post. Qualche altra idea? Grazie. –

+0

@AlejandroCasanova Se si utilizza la classe 'GCMBroadcastReceiver' inclusa nella domanda, non è necessario' GCMIntentService'. Tuttavia, il tuo manifest si riferisce a "com.google.android.gcm.GCMBroadcastReceiver". Qual è il pacchetto del 'GCMBroadcastReceiver' che hai incluso nella domanda? Probabilmente non è "com.google.android.gcm" (e se lo è, non dovrebbe essere). La mia ipotesi è che il tuo manifest si riferisca al "GCMBroadcastReceiver" predefinito di Google, ed è per questo che il tuo codice non funziona. – Eran

+0

Ho aggiornato il manifest con GCMIntentService mancante. In realtà ho due esempi e nessuno di loro funziona. Il primo utilizza il manifest corrente con GCMIntentService e la libreria helper. Penso che questa volta non manchi nulla. Il secondo progetto non utilizza la libreria helper e il ricevitore nel manifest è il seguente: Questa volta senza GCMIntentService. Il ricevitore nel 2 ° esempio è quello nella domanda. Ancora bloccato: ( –

0

Non dimenticare di cambiare 'com.example.gcm' al nome del pacchetto per esempio 'com.yourdomain.yourapp'

+0

Questo è il pacchetto che ho usato per il mio app demo. –

0

Stai utilizzando GCMBaseIntentService che è stato dichiarato obsoleto da Google. (Ma dovrebbe ancora funzionare.) Ho seguito l'ultimo tutorial http://developer.android.com/google/gcm/client.html e ho ricevuto messaggi. Puoi provarlo anche tu.

Un altro motivo possibile è che potresti aver ricevuto un messaggio ma non è stato mostrato correttamente in una notifica. Aggiungere questa riga nel metodo: sendNotification (String msg)

Log.i(TAG, msg); 
1

Dopo aver corretto i problemi di cui sopra ancora nessun messaggi push. Il problema era l'errore 403. Sembra che il servizio non sia disponibile a Cuba, quindi la soluzione è usare uno strumento come "la tua libertà" o "thor", ecc.