2012-12-21 12 views
7

Sto implementando GCM nella mia applicazione. Ho seguito tutti i passaggi indicati nel tutorial GCM da developer.android.comGCM: onMessage() di GCMIntentService viene chiamato Molte volte?

Sono in grado di ottenere l'ID registro da GCM con successo e sto passando questo ID al mio server applicazioni. Quindi la fase di registrazione viene eseguita con successo.

Ora, quando il mio server applicazione invia un messaggio push al dispositivo, il server ottiene il messaggio come SUCCESS = 8 GUASTO = 0, ecc, cioè Server sta inviando un messaggio con successo, ma OnMessage sempre chiamato 8 volte dipende il valore del successo.

Il mio dispositivo collegato gira il wifi della mia organizzazione senza impostazioni proxy.

Quindi la mia domanda è: perché sto ricevendo il messaggio PUSH da GCM come valore di tempo del successo. Perché Google sta offrendo così tanto tempo? Quale potrebbe essere la ragione?

mio GCMBaseIntentService sembra

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



    } 

La mia attività si presenta come

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> 

Ecco il mio codice lato server

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

Risposta dal server GCM al mio server delle applicazioni.

{"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

Nelle mie app GCM non lo fa - sembra più un bug nel tuo codice se me lo chiedi - puoi mostrare il codice? – ligi

+0

@ ligi ho aggiunto il mio codice. – Lakshmanan

+1

dov'è il codice lato server in cui si invia il messaggio con un particolare ID di registrazione? – appukrb

risposta

5

Che aspetto ha la tua risposta inviata ai tuoi server da GCM? È possibile che tu abbia lo stesso dispositivo registrato 8 volte separate con ID diversi, il che mi sembra molto probabile.

Si dovrebbe anche guardare il codice che si sta inviando ai server GCM per garantire che non si sta inviando lo stesso ID di registrazione otto volte.

Il formato della risposta è documentato qui: https://developer.android.com/google/gcm/gcm.html#response

Sulla base di che vorrei dare un'occhiata e vedere se si ricevono qualsiasi ID canonici di, che contribuirebbero a mostrare di avere lo stesso dispositivo ha registrato più volte. Puoi leggere ulteriori informazioni su cosa fare con Id canonico qui: android GCM get original id of canonical id

+0

@ selsine; Ho aggiunto la risposta del server GCM. Si prega di guardare fuori l'ID Cononico è 0. – Lakshmanan

+0

Grazie selsine: scopro il problema.Problema con il mio codice lato server, come il tuo ID registrazione singola supposizione aggiunto più volte nell'elenco dei miei dati di carico. – Lakshmanan

Problemi correlati