Android 谷歌云消息经常返回;“未注册”;错误

Android 谷歌云消息经常返回;“未注册”;错误,android,google-cloud-messaging,Android,Google Cloud Messaging,我尝试与客户端(Android应用程序)和服务器(J2EE)聊天。 我的应用程序的目的是与任何人聊天 有三个活动:第一个是背景为GCM resister的splashScreen,注册完成后,我开始第二个活动 第二个活动允许用户选择登录并等待用户。当用户到来时,此活动将收到推送通知并启动最后一个活动 第三个活动是聊天,用户可以发送消息和接收消息。当用户发送消息时,服务器发送推送通知以强制与另一个用户进行数据同步 这是我的问题,我的客户在一两次推送通知后丢失了注册。但有时它的工作时间超过10天。。

我尝试与客户端(Android应用程序)和服务器(J2EE)聊天。 我的应用程序的目的是与任何人聊天

有三个活动:第一个是背景为GCM resister的splashScreen,注册完成后,我开始第二个活动

第二个活动允许用户选择登录并等待用户。当用户到来时,此活动将收到推送通知并启动最后一个活动

第三个活动是聊天,用户可以发送消息和接收消息。当用户发送消息时,服务器发送推送通知以强制与另一个用户进行数据同步

这是我的问题,我的客户在一两次推送通知后丢失了注册。但有时它的工作时间超过10天。。。我不明白我为什么会有这个麻烦。我在stackoverflow上发现了NotRegistered错误的解释,但有几个原因

因此,我有三个问题:

  • 我可以从google GCM日志中获取我的应用程序以了解问题所在吗
  • 有没有办法在客户端检测此错误
  • 有人知道我为什么会有这个问题吗
  • 这是我的密码:

    清单:

    <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的一条消息,所以我会断开连接。可能是,如果我使用服务,我将始终管理邮件,我不会有那个错误。。。但这意味着很多改变。。。因此,如果您或任何人知道广播接收器的解决方案,请帮助我:)