¿Cómo implementar C2DM en android?

Estoy buscando cómo enviar notificaciones usando C2DM. Encontré algo y utilizando que soy capaz de generar la Registration Key , así como una Authentication Key .

Pero después de eso en la clase de ServerSimulator (código del lado del ServerSimulator ) conseguí el error 401 (401 desautorizado). Ahora pasé el username y la contraseña manualmente, que sincronizé en mi dispositivo androide. Tengo el mismo error que antes.

Me enfrento a este problema cuando hago clic en enviar mensaje botón ..

Estoy atascado en esta consulta. ¿Alguien ha logrado hacer esto?

 public class ServerSimulator extends Activity { private SharedPreferences prefManager; private final static String AUTH = "authentication"; private static final String UPDATE_CLIENT_AUTH = "Update-Client-Auth"; public static final String PARAM_REGISTRATION_ID = "registration_id"; public static final String PARAM_DELAY_WHILE_IDLE = "delay_while_idle"; public static final String PARAM_COLLAPSE_KEY = "collapse_key"; private static final String UTF8 = "UTF-8"; // Registration is currently hardcoded private final static String YOUR_REGISTRATION_STRING = "APA91bFkxmtIj5XiBU-Cze64s0gXNb7OmiWWZg-qLKibpLsVXaWq1X7hoRV9Ld9COYXirZAgkYegZBdBfUGt3lgtuhNJopvHB0KJ5ZyJ6Kt_HYRrZhgdJ1Y"; private SharedPreferences prefs; /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); prefManager = PreferenceManager.getDefaultSharedPreferences(this); } @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.mymenu, menu); return super.onCreateOptionsMenu(menu); } @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case R.id.menuitem_user: Intent intent = new Intent(this, UserPreferences.class); startActivity(intent); break; default: break; } return false; } public void getAuthentification(View view) { SharedPreferences prefs = PreferenceManager .getDefaultSharedPreferences(this); HttpClient client = new DefaultHttpClient(); HttpPost post = new HttpPost( "https://www.google.com/accounts/ClientLogin"); try { List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(1); nameValuePairs.add(new BasicNameValuePair("Email","myEmail id"))); nameValuePairs.add(new BasicNameValuePair("Passwd","my password"))); nameValuePairs.add(new BasicNameValuePair("accountType", "GOOGLE")); nameValuePairs.add(new BasicNameValuePair("source","Google-cURL-Example")); nameValuePairs.add(new BasicNameValuePair("service", "ac2dm")); post.setEntity(new UrlEncodedFormEntity(nameValuePairs)); HttpResponse response = client.execute(post); BufferedReader rd = new BufferedReader(new InputStreamReader( response.getEntity().getContent())); String line = ""; while ((line = rd.readLine()) != null) { Log.e("HttpResponse", line); if (line.startsWith("Auth=")) { Editor edit = prefManager.edit(); edit.putString(AUTH, line.substring(5)); edit.commit(); String s = prefManager.getString(AUTH, "n/a"); Toast.makeText(this, s, Toast.LENGTH_LONG).show(); } } } catch (IOException e) { e.printStackTrace(); } } public void showAuthentification(View view) { String s = prefManager.getString(AUTH, "n/a"); Toast.makeText(this, s, Toast.LENGTH_LONG).show(); } public void sendMessage(View view) { try { Log.e("Tag", "Started"); String auth_key = prefManager.getString(AUTH, "n/a"); // Send a sync message to this Android device. StringBuilder postDataBuilder = new StringBuilder(); postDataBuilder.append(PARAM_REGISTRATION_ID).append("=") .append(YOUR_REGISTRATION_STRING); // if (delayWhileIdle) { // postDataBuilder.append("&").append(PARAM_DELAY_WHILE_IDLE) // .append("=1"); // } postDataBuilder.append("&").append(PARAM_COLLAPSE_KEY).append("=") .append("0"); postDataBuilder.append("&").append("data.payload").append("=") .append(URLEncoder.encode("Lars war hier", UTF8)); byte[] postData = postDataBuilder.toString().getBytes(UTF8); // Hit the dm URL. URL url = new URL("https://android.clients.google.com/c2dm/send"); HttpURLConnection conn = (HttpURLConnection) url.openConnection(); conn.setDoOutput(true); conn.setUseCaches(false); conn.setRequestMethod("POST"); conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded;charset=UTF-8"); conn.setRequestProperty("Content-Length", Integer.toString(postData.length)); conn.setRequestProperty("Authorization", "GoogleLogin auth=" + auth_key); OutputStream out = conn.getOutputStream(); out.write(postData); out.close(); int responseCode = conn.getResponseCode(); Log.e("Tag", String.valueOf(responseCode)); // Validate the response code if (responseCode == 401 || responseCode == 403) { // The token is too old - return false to retry later, will // fetch the token // from DB. This happens if the password is changed or token // expires. Either admin // is updating the token, or Update-Client-Auth was received by // another server, // and next retry will get the good one from database. Log.e("C2DM", "Unauthorized - need token"); } // Check for updated token header String updatedAuthToken = conn.getHeaderField(UPDATE_CLIENT_AUTH); if (updatedAuthToken != null && !auth_key.equals(updatedAuthToken)) { Log.i("C2DM", "Got updated auth token from datamessaging servers: " + updatedAuthToken); Editor edit = prefManager.edit(); edit.putString(AUTH, updatedAuthToken); } String responseLine = new BufferedReader(new InputStreamReader( conn.getInputStream())).readLine(); // NOTE: You *MUST* use exponential backoff if you receive a 503 // response code. // Since App Engine's task queue mechanism automatically does this // for tasks that // return non-success error codes, this is not explicitly // implemented here. // If we weren't using App Engine, we'd need to manually implement // this. if (responseLine == null || responseLine.equals("")) { Log.i("C2DM", "Got " + responseCode + " response from Google AC2DM endpoint."); throw new IOException( "Got empty response from Google AC2DM endpoint."); } String[] responseParts = responseLine.split("=", 2); if (responseParts.length != 2) { Log.e("C2DM", "Invalid message from google: " + responseCode + " " + responseLine); throw new IOException("Invalid response from Google " + responseCode + " " + responseLine); } if (responseParts[0].equals("id")) { Log.i("Tag", "Successfully sent data message to device: " + responseLine); } if (responseParts[0].equals("Error")) { String err = responseParts[1]; Log.w("C2DM", "Got error response from Google datamessaging endpoint: " + err); // No retry. throw new IOException(err); } } catch (Exception e) { throw new RuntimeException(e); } } } 

Puede usar este enlace para esta respuesta y funciona bien para mí.

Actualmente está implementando C2DM de una manera más antigua. La forma en que usted está haciendo ofrece una gran cantidad de personalización, pero no mucha gente necesita ese tipo de personalización. Con el nuevo plugin de Google 2.4 Beta que realmente han comenzado a integrar todo, y es bastante agradable.

Te recomiendo que mires el Google IO + Android AppEngine. Mostrar cómo integrar Android, AppEngine, y C2DM juntos realmente muy simple. Usted puede crear algo que llaman un "AppEngine Connected Android Project". Así que en lugar de hacer un ServerSimulator, que realmente estaría trabajando con un servidor real que se puede configurar de forma gratuita.

http://www.youtube.com/watch?v=M7SxNNC429U

Si quisieras moverte a otro servidor, tendrías que volver a escribir el código del lado del servidor y luego cambiar la URL a la que se está publicando. Bastante simple. Yo recomiendo encarecidamente ver este ejemplo y trabajar con el código de stock, ya que le da algo de trabajo desde el bate para jugar con:

FYI, actualmente hay un error en el código (como está en atm beta) cuando se trata de registrarse en un servidor real appengine alojado (todo funciona bien localmente). Intenta enviar un token de registro caducado. He estado en contacto con los desarrolladores de Google y me proporcionaron una solución. Déjame saber si llegas al punto donde lo necesitas.

  • Android GCM enciende las luces
  • Las notificaciones de inserción de Parse.com no funcionan de forma consistente recibiendo el error "GCM -MISMATCH SENDER ID"
  • No se puede resolver el símbolo 'GoogleCloudMessaging' GCM
  • ¿Cómo implementar múltiples notificaciones push de GCM en una sola aplicación?
  • Enviar notificaciones mediante GCM en Android
  • Android: Notificación de prueba en línea (Google Cloud Messaging)
  • La notificación del constructor está obsoleta
  • Cómo agregar una notificación de inserción en mi propia aplicación de Android
  • ¿La notificación de FCM es confiable o no en android?
  • Pruebas GCM, ¿cómo provocar una respuesta del servidor GCM con un canonical_id?
  • Cómo enviar notificación push en dos segmentos en momentos diferentes en un día en analizar
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.