Android 谷歌云消息经常返回;“未注册”;错误
我尝试与客户端(Android应用程序)和服务器(J2EE)聊天。 我的应用程序的目的是与任何人聊天 有三个活动:第一个是背景为GCM resister的splashScreen,注册完成后,我开始第二个活动 第二个活动允许用户选择登录并等待用户。当用户到来时,此活动将收到推送通知并启动最后一个活动 第三个活动是聊天,用户可以发送消息和接收消息。当用户发送消息时,服务器发送推送通知以强制与另一个用户进行数据同步 这是我的问题,我的客户在一两次推送通知后丢失了注册。但有时它的工作时间超过10天。。。我不明白我为什么会有这个麻烦。我在stackoverflow上发现了NotRegistered错误的解释,但有几个原因 因此,我有三个问题:Android 谷歌云消息经常返回;“未注册”;错误,android,google-cloud-messaging,Android,Google Cloud Messaging,我尝试与客户端(Android应用程序)和服务器(J2EE)聊天。 我的应用程序的目的是与任何人聊天 有三个活动:第一个是背景为GCM resister的splashScreen,注册完成后,我开始第二个活动 第二个活动允许用户选择登录并等待用户。当用户到来时,此活动将收到推送通知并启动最后一个活动 第三个活动是聊天,用户可以发送消息和接收消息。当用户发送消息时,服务器发送推送通知以强制与另一个用户进行数据同步 这是我的问题,我的客户在一两次推送通知后丢失了注册。但有时它的工作时间超过10天。。
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.test.app"
android:versionCode="1"
android:versionName="1" >
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" />
<uses-feature
android:glEsVersion="0x00020000"
android:required="true" />
<application
android:allowBackup="true"
android:icon="@drawable/icon"
android:label="@string/app_name"
android:theme="@android:style/Theme.Light.NoTitleBar.Fullscreen" >
<meta-data
android:name="com.google.android.gms.version"
android:value="@integer/google_play_services_version" />
<activity
android:name="com.test.app.activity.SplashScreenActivity" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity
android:name="com.test.app.activity.NicknameActivity">
</activity>
<activity
android:name="com.test.app.activity.ConversationActivity">
</activity>
</application>
</manifest>
public class GCMHelper {
public final static String SENDER_ID = "MY ID";
public static void register(final Context context, final Activity activity) {
new AsyncTask() {
@Override
protected Object doInBackground(Object[] objects) {
try {
GoogleCloudMessaging gcm = GoogleCloudMessaging.getInstance(context);
gcm.register(GCM.SENDER_ID);
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
@Override
protected void onPostExecute(Object o) {
super.onPostExecute(o);
// Start NicknameActivity
}
}.execute(null,null,null);
}
}
public class SplashScreenActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_splashscreen);
GCMHelper.register(getApplicationContext(), this);
}
}
public class NicknameActivity extends Activity {
private IntentFilter filter = new IntentFilter("com.google.android.c2dm.intent.RECEIVE");
private BroadcastReceiver gcmBroadcastReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
// start conversation activity
}
};
@Override
protected void onResume() {
super.onResume();
registerReceiver(gcmBroadcastReceiver, filter);
}
@Override
protected void onPause() {
super.onPause();
unregisterReceiver(gcmBroadcastReceiver);
}
}
SplashScreenActivity:
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.test.app"
android:versionCode="1"
android:versionName="1" >
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" />
<uses-feature
android:glEsVersion="0x00020000"
android:required="true" />
<application
android:allowBackup="true"
android:icon="@drawable/icon"
android:label="@string/app_name"
android:theme="@android:style/Theme.Light.NoTitleBar.Fullscreen" >
<meta-data
android:name="com.google.android.gms.version"
android:value="@integer/google_play_services_version" />
<activity
android:name="com.test.app.activity.SplashScreenActivity" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity
android:name="com.test.app.activity.NicknameActivity">
</activity>
<activity
android:name="com.test.app.activity.ConversationActivity">
</activity>
</application>
</manifest>
public class GCMHelper {
public final static String SENDER_ID = "MY ID";
public static void register(final Context context, final Activity activity) {
new AsyncTask() {
@Override
protected Object doInBackground(Object[] objects) {
try {
GoogleCloudMessaging gcm = GoogleCloudMessaging.getInstance(context);
gcm.register(GCM.SENDER_ID);
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
@Override
protected void onPostExecute(Object o) {
super.onPostExecute(o);
// Start NicknameActivity
}
}.execute(null,null,null);
}
}
public class SplashScreenActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_splashscreen);
GCMHelper.register(getApplicationContext(), this);
}
}
public class NicknameActivity extends Activity {
private IntentFilter filter = new IntentFilter("com.google.android.c2dm.intent.RECEIVE");
private BroadcastReceiver gcmBroadcastReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
// start conversation activity
}
};
@Override
protected void onResume() {
super.onResume();
registerReceiver(gcmBroadcastReceiver, filter);
}
@Override
protected void onPause() {
super.onPause();
unregisterReceiver(gcmBroadcastReceiver);
}
}
昵称活动:
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.test.app"
android:versionCode="1"
android:versionName="1" >
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" />
<uses-feature
android:glEsVersion="0x00020000"
android:required="true" />
<application
android:allowBackup="true"
android:icon="@drawable/icon"
android:label="@string/app_name"
android:theme="@android:style/Theme.Light.NoTitleBar.Fullscreen" >
<meta-data
android:name="com.google.android.gms.version"
android:value="@integer/google_play_services_version" />
<activity
android:name="com.test.app.activity.SplashScreenActivity" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity
android:name="com.test.app.activity.NicknameActivity">
</activity>
<activity
android:name="com.test.app.activity.ConversationActivity">
</activity>
</application>
</manifest>
public class GCMHelper {
public final static String SENDER_ID = "MY ID";
public static void register(final Context context, final Activity activity) {
new AsyncTask() {
@Override
protected Object doInBackground(Object[] objects) {
try {
GoogleCloudMessaging gcm = GoogleCloudMessaging.getInstance(context);
gcm.register(GCM.SENDER_ID);
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
@Override
protected void onPostExecute(Object o) {
super.onPostExecute(o);
// Start NicknameActivity
}
}.execute(null,null,null);
}
}
public class SplashScreenActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_splashscreen);
GCMHelper.register(getApplicationContext(), this);
}
}
public class NicknameActivity extends Activity {
private IntentFilter filter = new IntentFilter("com.google.android.c2dm.intent.RECEIVE");
private BroadcastReceiver gcmBroadcastReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
// start conversation activity
}
};
@Override
protected void onResume() {
super.onResume();
registerReceiver(gcmBroadcastReceiver, filter);
}
@Override
protected void onPause() {
super.onPause();
unregisterReceiver(gcmBroadcastReceiver);
}
}
对话活动:
public class ConversationActivity extends Activity {
private IntentFilter filter = new IntentFilter("com.google.android.c2dm.intent.RECEIVE");
private BroadcastReceiver gcmBroadcastReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
// HTTP request to get the message
}
};
@Override
protected void onResume() {
super.onResume();
registerReceiver(gcmBroadcastReceiver, filter);
}
@Override
protected void onPause() {
super.onPause();
unregisterReceiver(gcmBroadcastReceiver);
}
}
PS:对不起我的英语,如果你读我的文章有任何困难。问我;)
提前感谢您的帮助 在出现
notregisted
错误之前,您是否收到发送到Android应用程序的所有消息?我怀疑GCM服务器错误地认为您的应用程序已被卸载。如果您的广播接收器未正确配置以收听这些广播消息,则可能会出现这种情况。请参阅第4项,谢谢您的回复!我在未注册错误之前收到所有消息。我想你是对的。我想因为我使用了BroadcastReceiver(在我的活动中使用了register),我可能会错过来自GCM的一条消息,所以我会断开连接。可能是,如果我使用服务,我将始终管理邮件,我不会有那个错误。。。但这意味着很多改变。。。因此,如果您或任何人知道广播接收器的解决方案,请帮助我:)