2012-12-21 11 views
7

Wdrażam GCM w mojej aplikacji. Postępowałem zgodnie ze wszystkimi krokami podanymi w samouczku GCM od developer.android.comGCM: onMessage() z GCMIntentService nazywa się Wiele razy?

Jestem w stanie pomyślnie uzyskać identyfikator rejestru z GCM i przekazuję ten identyfikator do mojego serwera aplikacji. Krok rejestracji został więc pomyślnie wykonany.

Teraz kiedy mój serwer aplikacji wysyła wiadomość Push to moim urządzeniu, serwer dostaje wiadomość jako success = 8 awarii = 0, etc., czyli serwer wysyła wiadomość pomyślnie, ale OnMessage coraz zwanego 8 razy zależy wartość sukcesu.

Moje podłączone urządzenie rzuca moją organizację wifi bez ustawień proxy.

Moje pytanie brzmi: dlaczego otrzymuję wiadomość PUSH od GCM jako wartość czasu sukcesu. Dlaczego Google dostarcza tak dużo czasu? Jaki mógł być powód?

Moja GCMBaseIntentService wygląda

public class GCMIntentService extends GCMBaseIntentService { 




    public GCMIntentService() { 
     super(GCMActivity.SENDER_ID); 
    } 

    @Override 
    protected void onError(Context arg0, String arg1) { 

     Log.d("GCM", "RECIEVED A ERROR MESSAGE"); 
     // TODO Auto-generated method stub 

    } 

    @Override 
    protected void onRegistered(Context arg0, String registrationId) { 

//Send the registration id to my app server to store the reg id list 
     GCMActivity.sendRegIdtoApplicationServer(registrationId); 

    } 


    @Override 
    protected void onUnregistered(Context arg0, String registrationId) { 
     // TODO Auto-generated method stub 

    } 

    @Override 
    protected void onMessage(Context context, Intent intent) { 
     Log.d("GCM", "RECIEVED A MESSAGE"); 

     // Get the data from intent and send to notificaion bar 


     String data = intent.getStringExtra("data"); 
     String action = intent.getAction(); 

     if((action.equals("com.google.android.c2dm.intent.RECEIVE"))) { 
      try { 
       JSONObject jsonObject = new JSONObject(data); 
       boolean updateStatus = jsonObject.getBoolean("update"); 



       if (updateStatus) { 
        //Showing Notification to user 


       } 

      } catch (JSONException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 
     } 



    } 

Moja Aktywność wygląda

public class GCMActivity extends Activity { 

    public final static String SENDER_ID = "872355133485"; 

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

     GCMRegistrar.checkDevice(this); 
     GCMRegistrar.checkManifest(this); 
     final String regId = GCMRegistrar.getRegistrationId(this); 
     if (regId.equals("")) { 
      GCMRegistrar.register(this, SENDER_ID); 

     } else { 

//   sendRegIdtoApplicationServer(regId); 
      Log.v("gh", "Already registered"); 
      System.out.println("RegisterID:"+ regId); 
      } 
     } 



And Manifest file will be 

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

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

    <permission android:name="com.aspire.gcmsample.permission.C2D_MESSAGE" android:protectionLevel="signature" /> 

    <uses-permission android:name="com.aspire.gcmsample.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" /> 
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> 

    <application 
     android:icon="@drawable/ic_launcher" 
     android:label="@string/app_name" 
     android:theme="@style/AppTheme" android:debuggable="true"> 

     <activity 
      android:name=".GCMActivity" 
      android:label="@string/title_activity_gcm" > 
      <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.aspire.gcmsample" /> 

       </intent-filter> 
     </receiver> 

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


</manifest> 

Oto mój serwer kodu po stronie

 Properties apHeaders = new Properties(); 

     // Use your own credentials for the below three lines 
     apHeaders.put("Content-Type", "application/json"); 
     apHeaders.put("Authorization","key="+apiKey); 

     /*String data = "{\"registration_ids\":"+ devicesList +", \"data\":" + 
       "{\"data\":{\"score\" : \"1-0\", \"scorer\" : \"Ronaldo\", \"time\" : \"44\"}}}";*/ 

     // get all registration Device ID from database 
     ArrayList<String> deviceId = DBRegistration.getInstance().fetchRegId(); 

     String data = "{\"registration_ids\":"+ deviceId +", \"data\":" + 
      "{\"data\":{\"update\" : \"true\", " + 
      "\"file\": \"http://192.168.4.210:8080/FileDownload/DownloadFile?path=GCMSample.apk\"}}}"; 

     String result = DBRegistration.getInstance().sendRequest(url, data, apHeaders);** 

     System.out.println("responseC"+ result); 
     out.println(result); 
     out.flush(); 

String apServerUrl = „https: // android. googleapis.com/gcm/send ";

public String sendRequest(String apServerUrl, String payload, Properties headers) { 

     // Setup Http URL connection 

     HttpURLConnection connection = null; 

     // Enable proxy if it needed. 
     Proxy proxy = new Proxy(Proxy.Type.HTTP, new InetSocketAddress(PROXY_URL, PROXY_PORT)); 

     try { 
      URL url = new URL(apServerUrl); 
      // Enable proxy if needed. 
      connection = (HttpURLConnection) url.openConnection(proxy); 
      //connection = (HttpURLConnection) url.openConnection(); 
      connection.setRequestMethod("POST"); 
      connection.setDoOutput(true); 
      Object[] keys = headers.keySet().toArray(); 
      for (int i = 0; i < keys.length; i++) { 
       connection.setRequestProperty((String) keys[i], 
         (String) headers.get(keys[i])); 
      } 
      //connection.setRequestProperty("Content-Length", ""+ payload.length()); 
     } catch (Exception e) { 
      System.out.println("Failed setting up HTTP Connection\n" + e); 
     } 

     // Send the Request 
     String line = ""; 
     String returnedResponse = ""; 
     BufferedReader reader = null; 

     System.out.println("Request: " + payload); 

     try { 
      OutputStream os = connection.getOutputStream(); 
      os.write(payload.toString().getBytes("UTF-8")); 
      os.close(); 
      int status = connection.getResponseCode();    
      if (status != 200) { 
       System.out.println("HTTP Error code " + status 
         + " received, transaction not submitted"); 
       reader = new BufferedReader(new InputStreamReader(connection 
         .getErrorStream())); 
      } else { 
       reader = new BufferedReader(new InputStreamReader(connection 
         .getInputStream())); 
      } 

      while ((line = reader.readLine()) != null) { 
       returnedResponse += line; 
      } 
     } catch (Exception e) { 
      returnedResponse = e.getMessage(); 
      System.out.println(e); 
     } finally { 
      try { 
       if (reader != null) 
        reader.close(); 
       if (connection != null) 
        connection.disconnect(); 
      } catch (Exception e) { 
       returnedResponse = e.getMessage(); 
       System.out.println(e); 
      } 
     } 
     System.out.println(returnedResponse); 
     return returnedResponse; 
    } 

Odpowiedź z serwera GCM na mój serwer aplikacji.

{"multicast_id":6552291927399218343,"success":13,"failure":0,"canonical_ids":0,"results":[{"message_id":"0:1356332586480671%79fa3a68f9fd7ecd"},{"message_id":"0:1356332586480674%79fa3a68f9fd7ecd"},{"message_id":"0:1356332586481759%79fa3a68f9fd7ecd"},{"message_id":"0:1356332586480807%79fa3a68f9fd7ecd"},{"message_id":"0:1356332586481944%79fa3a68f9fd7ecd"},{"message_id":"0:1356332586480996%79fa3a68f9fd7ecd"},{"message_id":"0:1356332586481939%79fa3a68f9fd7ecd"},{"message_id":"0:1356332586482000%79fa3a68f9fd7ecd"},{"message_id":"0:1356332586481997%79fa3a68f9fd7ecd"},{"message_id":"0:1356332586481942%79fa3a68f9fd7ecd"},{"message_id":"0:1356332586482003%79fa3a68f9fd7ecd"},{"message_id":"0:1356332586481948%79fa3a68f9fd7ecd"},{"message_id":"0:1356332586480995%79fa3a68f9fd7ecd"}]} 
+0

W moich aplikacjach GCM to nie robi - brzmi bardziej jak błąd w kodzie, jeśli mnie pytasz - czy możesz pokazać kod? – ligi

+0

@ ligi Dodałem mój kod. – Lakshmanan

+1

gdzie jest kod po stronie serwera, na który wysyłasz wiadomość o określonym identyfikatorze rejestracyjnym? – appukrb

Odpowiedz

5

Jak wygląda odpowiedź na Twoje serwery z GCM? Możliwe, że masz to samo urządzenie zarejestrowane 8 oddzielnych razy z różnymi identyfikatorami, co wydaje mi się najbardziej prawdopodobną przyczyną.

Należy również sprawdzić kod wysyłany do serwerów GCM, aby upewnić się, że nie wysyła się tego samego identyfikatora rejestracji osiem razy.

Format odpowiedzi jest udokumentowane tutaj: https://developer.android.com/google/gcm/gcm.html#response

oparciu o które chciałbym przyjrzeć i zobaczyć, czy otrzymujesz żadnych kanonicznych identyfikatorów, które mogłyby pomóc, aby pokazać, że masz to samo urządzenie zarejestrowany wielokrotnie. Możesz przeczytać więcej o tym, co zrobić z kanonicznymi identyfikatorami tutaj: android GCM get original id of canonical id

+0

@ selsine; Dodałem odpowiedź serwera GCM. Proszę spojrzeć na Kononiczny identyfikator 0. – Lakshmanan

+0

Dzięki selsine: Dowiedziałem się o problemie.Problem z moim kodem po stronie serwera, np. Przy założeniu, że identyfikator pojedynczej rejestracji został dodany wiele razy na liście urządzeń moich danych ładunku. – Lakshmanan

Powiązane problemy