android - notification - Nuevo error de fuente desconocida de registro de API de GCM
registration_ids firebase (2)
Actualmente estoy creando una aplicación que utiliza el nuevo sistema de mensajería en la nube de Google. Tengo un servidor cliente HTTP configurado en un entorno en vivo que me permite realizar pruebas a través de mis dispositivos móviles, pero siempre que intento registrarme con el GCM gcm.register()
una excepción IOException que indica que gcm.register()
está recibiendo una fuente desconocida impidiéndome obtener el ID de registro Necesito permitir que mi servidor envíe mensajes a mi dispositivo.
He revisado varias veces para ver si mi Id. De remitente está equivocada y también he revisado mi manifiesto para ver si tengo ese error también y parece que no puedo encontrar el problema. Mirar a mi alrededor tampoco ha proporcionado ninguna respuesta a mi problema.
Aquí está mi registro:
07-18 11:34:25.487: W/System.err(3093): java.io.IOException: MAIN_THREAD
07-18 11:34:25.497: W/System.err(3093): at com.google.android.gms.gcm.GoogleCloudMessaging.register(Unknown Source)
07-18 11:34:25.497: W/System.err(3093): at koodoo.pushtest.MainActivity.onCreate(MainActivity.java:94)
07-18 11:34:25.497: W/System.err(3093): at android.app.Activity.performCreate(Activity.java:4492)
07-18 11:34:25.497: W/System.err(3093): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1049)
07-18 11:34:25.497: W/System.err(3093): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1920)
07-18 11:34:25.497: W/System.err(3093): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1981)
07-18 11:34:25.497: W/System.err(3093): at android.app.ActivityThread.access$600(ActivityThread.java:123)
07-18 11:34:25.497: W/System.err(3093): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1147)
07-18 11:34:25.497: W/System.err(3093): at android.os.Handler.dispatchMessage(Handler.java:99)
07-18 11:34:25.497: W/System.err(3093): at android.os.Looper.loop(Looper.java:137)
07-18 11:34:25.497: W/System.err(3093): at android.app.ActivityThread.main(ActivityThread.java:4424)
07-18 11:34:25.497: W/System.err(3093): at java.lang.reflect.Method.invokeNative(Native Method)
07-18 11:34:25.497: W/System.err(3093): at java.lang.reflect.Method.invoke(Method.java:511)
07-18 11:34:25.497: W/System.err(3093): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
07-18 11:34:25.497: W/System.err(3093): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
07-18 11:34:25.497: W/System.err(3093): at dalvik.system.NativeStart.main(Native Method)
Aquí está mi manifiesto:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="koodoo.pushtest"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk
android:minSdkVersion="8"
android:targetSdkVersion="17" />
<!-- GCM connects to Internet 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" />
<!-- Creates a custom permission so only this app can receive its messages. -->
<permission
android:name="koodoo.pushtest.permission.C2D_MESSAGE"
android:protectionLevel="signature" />
<uses-permission android:name="koodoo.pushtest.permission.C2D_MESSAGE" />
<!-- This app has permission to register and receive data message. -->
<uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" />
<!-- Network State Permissions to detect Internet status -->
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<!-- Permission to vibrate -->
<uses-permission android:name="android.permission.VIBRATE" />
<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name="koodoo.pushtest.MainActivity"
android:label="@string/app_name" >
</activity>
<receiver
android:name="com.google.android.gcm.GCMBroadcastReceiver"
android:permission="com.google.android.c2dm.permission.SEND" >
<intent-filter>
<!-- Receives the actual messages. -->
<action android:name="com.google.android.c2dm.intent.RECEIVE" />
<!-- Receives the registration id. -->
<action android:name="com.google.android.c2dm.intent.REGISTRATION" />
<category android:name="koodoo.pushtest" />
</intent-filter>
</receiver>
<service android:name="com.google.android.gcm.GCMIntentService" />
<activity
android:name="koodoo.pushtest.RegisterActivity"
android:label="@string/title_activity_register" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
Cualquier ayuda para solucionar este problema sería muy apreciada.
1. Simplemente cree la clase GCMHelper para obtener el ID de CGM.
public final class GCMHelper {
static GoogleCloudMessaging gcm = null;
static Context context= null;
public GCMHelper (Context context)
{
this.context= context;
}
public String GCMRegister (String SENDER_ID) throws Exception
{
String regid = "";
//Check if Play store services are available.
if(!checkPlayServices())
throw new Exception("Google Play Services not supported. Please install and configure Google Play Store.");
if (gcm == null) {
gcm = GoogleCloudMessaging.getInstance(context);
}
regid = gcm.register(SENDER_ID);
return regid;
}
private static boolean checkPlayServices() {
int resultCode = GooglePlayServicesUtil.isGooglePlayServicesAvailable(context);
if (resultCode != ConnectionResult.SUCCESS) {
return false;
}
return true;
}
}
2. Luego cree el método GetGCM () en la Actividad.
//**To avoid java.io.IOException: MAIN_THREAD**
private void GetGCM() {
Thread thread = new Thread(new Runnable() {
@Override
public void run() {
try {
GCMHelper gcmRegistrationHelper = new GCMHelper (
getApplicationContext());
String gcmRegID = gcmRegistrationHelper.GCMRegister(SENDER_ID);
} catch (Exception bug) {
bug.printStackTrace();
}
}
});
thread.start();
}
3. Luego llame al método GetGCM () donde quiera.
Codificación 4.happy ...
Ese es el error que está recibiendo:
java.io.IOException: MAIN_THREAD
Significa que está llamando al método de registro desde el hilo principal, lo cual no está permitido. Deberías llamarlo desde otro hilo.
Cadena final estática pública ERROR_MAIN_THREAD
Los métodos de GCM están bloqueando. No debe ejecutarlos en el hilo principal o en los receptores de difusión. Valor constante: "MAIN_THREAD"
Aquí hay un ejemplo de código de la documentación de GCM :
/**
* Registers the application with GCM servers asynchronously.
* <p>
* Stores the registration id, app versionCode, and expiration time in the
* application''s shared preferences.
*/
private void registerBackground() {
new AsyncTask() {
@Override
protected String doInBackground(Void... params) {
String msg = "";
try {
if (gcm == null) {
gcm = GoogleCloudMessaging.getInstance(context);
}
regid = gcm.register(SENDER_ID);
msg = "Device registered, registration id=" + regid;
// You should send the registration ID to your server over HTTP,
// so it can use GCM/HTTP or CCS to send messages to your app.
// For this demo: we don''t need to send it because the device
// will send upstream messages to a server that echo back the message
// using the ''from'' address in the message.
// Save the regid - no need to register again.
setRegistrationId(context, regid);
} catch (IOException ex) {
msg = "Error :" + ex.getMessage();
}
return msg;
}
@Override
protected void onPostExecute(String msg) {
mDisplay.append(msg + "/n");
}
}.execute(null, null, null);
}