2013-08-25 17 views
15

Próbuję użyć usługi GCM do wysyłania powiadomień push do moich urządzeń.Wiadomość Android GCM została pomyślnie wysłana, ale nie została odebrana.

ja poszedł za Android Hive tutorial (który jest teraz przestarzała jak many other questions and answers na ten temat) dla funkcji po stronie serwera, które poszukują do pracy zgodnie z oczekiwaniami, ponieważ mogę dostać tego rodzaju wyjścia:

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

Ale zgodnie z some answers, otrzymanie tej odpowiedzi oznacza po prostu, że wiadomość została zaakceptowana przez serwery GCM do wysłania, ale nie została wysłana. Tak więc, zgodnie z oczekiwaniami, mój BroadcastReceiver nic nie otrzymuje.

Oto mój kod BroadcastReceiver:

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); 
    } 

} 

i mój 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" /> 

I kod po stronie serwera:

$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; 

mam kodowanie od domu, więc załóżmy, że GCM nie miałby problemów z wejściem i wyjściem z sieci, ponieważ GCM używa krewnych d połączenia odwrotnego powłoki. W każdym razie nie otrzymuję żadnego z wyników dziennika, którego się spodziewam.

EDIT: Po opuszczeniu mojej aplikacji działa na chwilę, LogCat wysłał mi następujące wyjścia:

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

Kod serwera jest nieistotny dla twojego pytania, ponieważ otrzymałeś pomyślną odpowiedź od Google. Czy możesz podać swój kod klienta? – Eran

+0

kod klienta ma być odbierany tylko dlatego, że jest aplikacją między systemową, a serwer obsługuje wszystkie wysyłania. jakiej części kodu potrzebujesz? – Jivay

+0

Odbiornik transmisji i usługa intencji. – Eran

Odpowiedz

14

Oto twój błąd:

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

należy:

<receiver 
    android:name=".GcmBroadcastReceiver" 
    android:permission="com.google.android.c2dm.permission.SEND" > 
Powiązane problemy