¿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.
- Error de GCM - googleCloudMessaging.register
- Notificación Push de Android C2DM
- En algún momento no recibe notificación push GCM en Mobile
- Force Parse Push Notifications para usar PPNS en lugar de GCM
- El servicio de Intención de GCM OnRegistered no se recibe
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); } } }
- Gcm GoogleCloudMessaging nueva implementación
- Notificación de empuje en Web móvil
- C2DM a Google Cloud Messaging (GCM)
- Phonegap PushNotification para abrir una página de aplicación específica
- ID canónico de GCM
- Cómo recuperar ID de registro y enviar un mensaje a una aplicación de terceros en android c2dm0 +
- ¿Por qué obtengo "MismatchSenderId" desde el lado del servidor GCM?
- ¿Es necesaria una cuenta de Google para GCM (Google Cloud Messaging)?
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.
- ¿Cómo puedo regular el framerate en mi aplicación android?
- Cómo guardar credenciales en Android / jQuery Mobile App