当前位置: 首页 > 面试题库 >

GCM不适用于姜饼,但适用于冰淇淋三明治

锺离嘉茂
2023-03-14
问题内容

我正在写一个使用GCM消息的游戏。当一名玩家进入转牌移动到服务器时,服务器将向其对手发送一条GCM消息,让客户知道有其他转弯数据可用。这应该很简单。我尽可能地遵循了示例GCM客户代码。

我有两个要测试的设备:带有4.4.0冰淇淋三明治的Motorola Xoom带有2.3.5版姜饼的Motorola X2

两种设备都有Goggle帐户设置(实际上是同一帐户)。我可以从两者的Play商店下载应用程序。收到新的Google
Talk消息或Gmail消息时,我都会收到通知消息。他们俩都在使用相同的Wi-
Fi网络在我面前,因此我可以确认没有防火墙问题。我两个都安装了相同的游戏应用程序。我已经能够在两台设备上获得GCM注册ID号。除了Android
OS版本,这两个设备实际上是相同的。但是,Xoom会收到GCM消息,而X2不会,或者至少这些消息没有在X2上广播给我的应用程序。

这是我的清单文件:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="myGame.app.main" android:versionCode="1" android:versionName="1.0">
<uses-sdk android:minSdkVersion="8" android:targetSdkVersion="16" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.VIBRATE" />
<uses-permission android:name="android.permission.GET_ACCOUNTS" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" />
<permission android:name="myGame.app.main.permission.C2D_MESSAGE" android:protectionLevel="signature" />
<uses-permission android:name="myGame.app.main.permission.C2D_MESSAGE" />

<application android:icon="@drawable/icon" android:name="myGameApp" android:label="@string/app_name" android:description="@string/description" android:theme="@style/GlobalTheme" android:killAfterRestore="false" android:allowTaskReparenting="false" android:persistent="false">

    ... Other Activities ...

    <receiver android:name="com.google.android.gcm.GCMBroadcastReceiver" android:permission="com.google.android.c2dm.permission.SEND" >
        <intent-filter>
            <action android:name="com.google.android.c2dm.intent.RECEIVE" />
            <action android:name="com.google.android.c2dm.intent.REGISTRATION" />
            <category android:name="myGame.app.main" />
        </intent-filter>
    </receiver>
    <service android:name=".GCMIntentService" android:enabled="true" />
    </application>
</manifest>

这是我的GCMIntentService的代码:

package myGame.app.main;

import com.google.android.gcm.GCMBaseIntentService;
import com.google.android.gcm.GCMRegistrar;
import android.content.Context;
import android.content.Intent;
import android.os.PowerManager;
import java.util.logging.Logger;

public class GCMIntentService extends GCMBaseIntentService
{
    private static PowerManager.WakeLock sWakeLock;
    private static final Object LOCK = GCMIntentService.class;
    private static final String GCM_SENDER_ID = "... My Sender ID...";
    private static final String GCM_INTENT_FILTER = "myGame.app.main.GCM_MESSAGE";
    private static final String MESSAGE_TYPE = "Type";
    private static final String MESSAGE_CONTENT = "Body";
    private static Logger log = Logger.getLogger(GCMIntentService.class.getName());

    public GCMIntentService()
    {
        super(GCM_SENDER_ID);
    }

    static void runIntentInService(Context context,Intent intent)
    {
        synchronized(LOCK)
        {
            if (sWakeLock == null)
            {
                PowerManager pm = (PowerManager) context.getSystemService(Context.POWER_SERVICE);
                sWakeLock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK,"sc_wakelock");
            }
        }
        sWakeLock.acquire();
        intent.setClassName(context,GCMIntentService.class.getName());
        context.startService(intent);
    }

    @Override protected void onRegistered(Context context,String registrationId)
    {
        log.warning("From GCMIntentService: Device successfully registered as "+registrationId);
        ... Other Code ...
    }

    @Override protected void onUnregistered(Context context,String registrationId)
    {
        log.warning("From GCMIntentService: Device successfully unregistered");
        ... Other Code ...
    }

    @Override protected void onMessage(Context context,Intent messageIntent)
    {
        log.warning("From GCMIntentService: Game update notice received");
        ... Other Code ...
    }

    @Override protected void onDeletedMessages(Context context,int total)
    {
        log.warning("From GCMIntentService: Server deleted "+Integer.toString(total)+" pending messages");
    }

    @Override public void onError(Context context,String errorId)
    {
        log.warning("From GCMIntentService: Error "+errorId);
        ... Other Code ...
    }

    @Override protected boolean onRecoverableError(Context context,String errorId)
    {
        log.warning("From GCMIntentService: Recoverable error "+errorId);
        return(super.onRecoverableError(context,errorId));
    }
}

我什至可以使用自己的getGCMIntentServiceClassName()函数创建自己的GCMBroadcastReceiver类,并在其中放置一条日志消息。在我尝试过的每个版本中,当应用程序在Xoom上运行时,我都会看到正确的LogCat消息,但在X2上根本看不到任何GCM消息。好像GCMBroadcastReceiver和/或GCMIntentService根本不起作用,但是我看不到任何类型的错误消息。

谁能帮我这个?


问题答案:

我为GCM消息编译了示例代码。我所做的唯一更改是使用了我在游戏应用程序中使用的相同API密钥和发件人ID。该应用程序在两种设备上都可以运行,因此我可以再次确认没有网络问题,并且可以确认X2实际上可以接收GCM消息。

坏消息是X2仍未收到我的游戏的GCM消息。经过更多研究,我发现当服务器尝试向X2发送GCM消息时(仅适用于我的游戏应用程序),服务器收到ERROR_NOT_located结果。没有这样的错误发送到Xoom。我已确认服务器已成功接收注册ID号。我知道这很难说,但是注册ID在传输过程中不会被破坏。

对于如何从GCM服务器注销设备,我尝试了一些不同的已发布建议,但似乎都没有用。我总是会再次收到相同的注册ID。因此,我完全卸载了游戏,然后将其重新安装在X2上。这迫使它获得一个新的注册ID号,从而解决了该问题。我的游戏现在在两种设备上均可正常运行。我必须假设在调试时,注册ID在游戏和GCM服务器之间以某种方式混淆了。

我只能希望这不会成为常规问题,因为除了卸载应用程序之外,似乎没有成功的修复方法。



 类似资料:
  • 问题内容: Pycharm 2016.2.3,Mac OS X 10.11.1,Python 3.5(Homebrew); 我有这个文件夹结构 所以我的预期输出是 从PyCharm运行时,此方法工作正常。但是,当我从终端运行它时,我收到一个ImportError: 我已经找到了这个问题,这是关于相同的问题。但是,没有建议的解决方案对我有用,因为我确实使用的是与PyCharm相同的Python解释器

  • 问题内容: 嗨,我只是简单地尝试在www.example.com上获取h1标签,该标签显示为“ Example Domain”。该代码适用于http://www.example.com,但不适用于https://www.exmaple.com。我该如何解决这个问题?谢谢 问题答案: PhantomJSDriver不支持(所有)DesiredCapabilities。 你会需要: 记录在这里:htt

  • 所以我使用这种方法写入文件,它在windows上运行完全正常,但在mac上运行时,它会创建文件,但它们是空的。 我知道数据是正确的,因为它打印正确。感谢您的任何帮助,这真的让我绊倒了。

  • 我搜索了很长时间,想找到一个解决方案来改变我应用程序中状态栏的颜色。实际上我使用的是MinAPI14,所以我不能使用Lollipop版本中的方法。 有没有办法更改API 14的状态栏颜色?(我在Play Store上看到一个应用程序改变了颜色,我在手机上看到了API 19)

  • 列名称的类型为int[] 上述查询适用于postgresql,但不适用于hsqldb,甚至适用于sql 尝试的hsqldb版本:2.2.9和2.3.0 在hsqldb中工作的sql是从table_name中选择x,unnest(column_name)y(x)x和y不是该表的列。

  • 我能够成功地打电话给邮递员: /mfp/api/az/v1/token和 /mfpadmin/management-apis/2.0/runtimes/mfp/applications 我正在获取从/mfp/api/az/v1/token接收的承载令牌,并将其添加到/mfp/applications的授权标头中。 我收到了来自两者的200个响应,并从每个API中获取了预期的信息。 然后,我选择从P