2013-08-25 11 views
15

Ich versuche, den GCM-Dienst zu verwenden, um Push-Benachrichtigungen an meine Geräte zu senden.Android GCM-Nachricht erfolgreich gesendet, aber nicht empfangen

Ich habe folgte die Android Hive tutorial für die serverseitige Funktionen (die jetzt wie many other questions and answers über diese veraltet ist), die wie erwartet aussehen zu arbeiten, da ich diese Art von Ausgaben bekommen:

{"multicast_id":9131068334342174816,"success":1,"failure":0,"canonical_ids":0,"results":[{"message_id":"0:1377441098827443%1d84a26ff9fd7ecd"}]} 

Aber Gemäß some answers bedeutet das Empfangen dieser Antwort, dass die Nachricht von den GCM-Servern zum Senden akzeptiert wurde, aber nicht, dass sie gesendet wurde. Also, wie erwartet, meine BroadcastReceiver erhält nichts.

Hier ist mein BroadcastReceiver Code:

public class GcmBroadcastReceiver extends BroadcastReceiver { 
    @Override 
    public void onReceive(Context context, Intent intent) { 
     Log.i("gcm_debug", "PushReceiver onReceive called"); 

     Bundle extras = intent.getExtras(); 
     GoogleCloudMessaging gcm = GoogleCloudMessaging.getInstance(context); 

     String msgType = gcm.getMessageType(intent); 

     if(!extras.isEmpty()){ 
      if(GoogleCloudMessaging.MESSAGE_TYPE_SEND_ERROR.equals(msgType)){ 
       Log.i("gcm_debug", "Message send error"); 
      }else if(GoogleCloudMessaging.MESSAGE_TYPE_DELETED.equals(msgType)){ 
       Log.i("gcm_debug", "Message deleted"); 
      }else if(GoogleCloudMessaging.MESSAGE_TYPE_MESSAGE.equals(msgType)){ 
       Log.i("gcm_debug", "Message received : " + extras.toString()); 
      } 
     } 

     setResultCode(Activity.RESULT_OK); 
    } 

} 

Und mein AndroidManifest:

<uses-permission android:name="android.permission.INTERNET"/> 
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/> 
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> 
<uses-permission android:name="android.permission.GET_ACCOUNTS" /> 
<uses-permission android:name="com.google.android.providers.gsf.permission.READ_GSERVICES" /> 
<uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" /> 

<permission android:name="<MYAPP>.permission.C2D_MESSAGE" 
      android:protectionLevel="signature" /> 
<uses-permission android:name="<MYAPP>.permission.C2D_MESSAGE" /> 

<!-- Require OpenGL ES2 for GMap --> 
<uses-feature android:glEsVersion="0x00020000" 
       android:required="true" /> 


<!-- Because this app is using the GCM library to send messages, the min SDK cannot be lower 
than 8 --> 
<uses-sdk 
    android:minSdkVersion="8" 
    android:targetSdkVersion="18" /> 


<application 
    android:allowBackup="true" 
    android:icon="@drawable/ic_launcher" 
    android:label="@string/app_name" 
    android:theme="@style/LovRTheme" > 
    <receiver 
     android:name=".GcmBroadcastReceiver" 
     android:permission="com.google.android.gcm.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="<MYAPP>" /> 
     </intent-filter> 
    </receiver> 
    <service android:name=".GcmIntentService" /> 

Und der serverseitigen Code:

$url = "https://android.googleapis.com/gcm/send"; 
    $fields = array(
     'registration_ids' => array($dstRegId), 
     'delay_while_idle' => true, 
     'data' => array("message" => $message)); 

    $headers = array(
     'Authorization: key=' . $google_api_key, 
     'Content-Type: application/json'); 

    $ch = curl_init(); 

    curl_setopt($ch, CURLOPT_URL, $url); 
    curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); 
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 

    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); 

    curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($fields)); 

    $result = curl_exec($ch); 
    if($result === FALSE){ 
     die("Curl failed"); 
    } 
    curl_close($ch); 

    echo $result; 

Ich bin von zu Hause Codierung, so dass ich Nehmen wir an, dass GCM keine Probleme haben würde, in das Netzwerk ein- und auszusteigen, da GCM einen Verwandten verwendet d der umgekehrten Shell-Verbindung. Wie auch immer, ich bekomme keinen Log-Output, den ich erwarte.

EDIT: Nach meiner App für eine Weile laufen lassen, LogCat mich gesandt hat folgende Ausgänge:

08-26 00:00:48.984 17966-17966/? D/GCM: Ignoring attempt to send heartbeat on dead connection. 
08-26 00:01:49.000 17966-17966/? D/GCM: Ignoring attempt to send heartbeat on dead connection. 
08-26 00:02:01.672  433-448/? W/BroadcastQueue: Permission Denial: broadcasting Intent { act=com.google.android.c2dm.intent.RECEIVE flg=0x10 pkg=<myApp> (has extras) } from com.google.android.gsf (pid=17966, uid=10003) requires com.google.android.gcm.c2dm.permission.SEND due to receiver com.navissal.lovr/com.navissal.lovr.GcmBroadcastReceiver 
08-26 00:17:09.063 17966-17966/? D/GCM: Ignoring attempt to send heartbeat on dead connection. 
08-26 00:18:09.086 17966-17966/? D/GCM: Ignoring attempt to send heartbeat on dead connection. 
08-26 00:24:15.250 3936-3951/? V/meshclient: uri: [/beacon?e=wTkyFfdWFtlzOme7rNizVCtnUu9t3SbJgKCe72og-OhyhGIYab1QikytBeU2Nc02QwdDtqI4sX7HHU6GpDQL8zZdKXFXmCics6ZG-Jmr84yvMX1x9EqdyyW1UI6PEhoOb9MV4R_msQ_MEWFnwUzQrV-vGTycKtSNKMMIRE-zM1caIe__7hdu_UStbhz0dhl7cAFmHYF74IQI6EYFCEORxgV2Wts4Ls-hRWEKfEzuBhViND7TeCVpqUOhdVwGMnDO_Qwlo0rpuSNFegdfJCYY4L8fZJogPsXdQW2cFSZ2S0kujCH9uIrljFUTSGcM5GCFuJRq8vWiTP07MqpMq7h2fGGpXQvjImFcVP81erkVzvlYu3bNpjyQe6MhxSFEZrG37Kdp2Fd3liXFZzSjKlLILeYsDK9rRYqO8fEy3PH07et1HjqYWrH-v7wnjcQm6TtyZu914oR-dPBAwX9D3WvbdQlPlqxnuwJ1huUTwaiKotPLgrAzo3Mc5vI93VTs3row] 
+0

Der Servercode ist für Ihre Frage nicht relevant, da Sie haben eine erfolgreiche Antwort von Google erhalten. Können Sie Ihren Kundencode hinzufügen? – Eran

+0

Client-Code soll nur empfangen werden, da es sich um eine systemübergreifende App handelt und der Server das gesamte Senden abwickelt. Welchen Teil des Codes benötigen Sie? – Jivay

+0

Der Rundfunkempfänger und der Intent-Dienst. – Eran

Antwort

14

Hier ist Ihr Fehler:

<receiver 
    android:name=".GcmBroadcastReceiver" 
    android:permission="com.google.android.gcm.c2dm.permission.SEND" > 

Es sollte:

<receiver 
    android:name=".GcmBroadcastReceiver" 
    android:permission="com.google.android.c2dm.permission.SEND" > 
Verwandte Themen