GCM 注册:服务在移动网络上不可用

Posted

技术标签:

【中文标题】GCM 注册:服务在移动网络上不可用【英文标题】:GCM registration : SERVICE NOT AVAILABLE on mobile network 【发布时间】:2014-04-05 07:19:18 【问题描述】:

我在 GCM 注册期间收到 SERVICE NOT AVAILABLE。

奇怪的行为是当设备在 Wifi 上时代码运行良好。在移动网络上几乎总是失败(90 % 次)。

移动数据上的互联网运行良好,其他服务器操作也正常运行,但与 Wifi 相比速度稍慢。

我尝试添加一个简单的循环(不是指数等待)以在睡眠间隔后继续重试,但没有运气。

在我打开 Wifi 的那一刻,操作(GCM 注册)成功。

请帮忙。

****更新更多信息** **:我在我的设备上测试了GCM Demo,它也有同样的问题。在移动数据上失败,在 Wifi 上工作正常。 失败的设备是 Note 3,目标版本是 4.4.2。 奇怪的是,相同的代码在其他设备上也能正常工作(2.3.6 版)

GCM 注册

try 
                String sDeviceID=null;
                if (checkPlayServices()) 
                    GoogleCloudMessaging gcm = GoogleCloudMessaging.getInstance(context);
                    sDeviceID = getRegistrationId(context);
                    if (sDeviceID==null) 
                        for(int i=0;i<60;i++)
                            try
                                sDeviceID= gcm.register(SENDER_ID);
                                break;
                            catch(IOException e)
                                Thread.sleep(2000);
                                continue;
                            
                        
                        // Persist the regID - no need to register again.
                        storeRegistrationId(context, sDeviceID);
                    
                    sDeviceID = getRegistrationId(context);
                    if (sDeviceID==null) 
                        error=true;
                        throw new Exception("GCM Error");
                    

清单 XML

            <!-- 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="com.planetapp.schoolink" />
        </intent-filter>
    </receiver>

    <service android:name="com.planetapp.schoolink.GCMIntentService" />

广播接收器

public class GCMBroadcastReceiver extends WakefulBroadcastReceiver  
    @Override
    public void onReceive(Context context, Intent intent) 
    System.out.println("++++++++++++ON RECEIVE");
       String regId = intent.getExtras().getString("registration_id");

       if(regId != null && !regId.equals("")) 
          /* Do what ever you want with the regId eg. send it to your server */
           System.out.println("++++++++++++ID RECEIVED++++++++++++"+regId);

       
    

【问题讨论】:

使用此链接***.com/questions/17188982/… 问题已解决。在我的手机上,“谷歌服务”设置了“限制后台数据”。这就是关闭 Wifi 时“Google 服务框架”或“Google Play 服务”不可用的原因。一旦我取消了限制,我就开始正常工作了! @Mahesh 我没有选中限制背景数据,但仍然面临与您报告的相同的问题。如果我是正确的,我指的是设置>数据使用>选项菜单>限制后台数据。 @Mahesh,请注意回答comments 【参考方案1】:

OP 解决了他的问题并在评论中写下了解决方案。解决方案:

Issue resolved. On my mobile, "Google Services" had setting "Restrict background data" checked. This was the reason why "Google Services Framework" or "Google Play Services" was not available when Wifi was turned off. Once I removed the restriction, I started working fine !

进入设置

查找数据使用情况

寻找“Google Play 服务”

当您进入另一个屏幕时:

    菜单 限制BackgroundData(检查是否选中并取消选中。)

【讨论】:

如何在 nexus 5 中检查此设置 “Google 服务”面板在哪里?【参考方案2】:

如果你使用安卓模拟器,服务将不可用

【讨论】:

以上是关于GCM 注册:服务在移动网络上不可用的主要内容,如果未能解决你的问题,请参考以下文章

向 Amazon SNS 移动推送服务注册移动/Android 终端节点

移动基础适配器日志在 bluemix 上不可用

回滚/取消 android-gcm 通知

如何确保可以从我的设备网络访问 GCM 服务器?

当 3G 网络可用时,Android GCM 不适用于 wifi 网络

Andoid 的 webview apk 应用程序无法正常工作。 JQuery 在网络应用程序上工作,但相同的功能在移动版本上不应该做的事情