移动后端启动器连续查询永不返回

时间:2013-07-18 04:49:21

标签: android google-app-engine google-cloud-messaging google-cloud-endpoints

我根据this教程为移动后端入门应用编写了一个Android客户端。一切都适用于实施Continuous Queries的部分。

我已经编写了一个查询,我从代码中的正确位置(onPostCreate())调用它,但查询从不返回任何数据。

我不相信这是一个身份验证问题,因为我能够成功拨打其他电话。

以下是永远不会返回结果的代码:

CloudCallbackHandler<List<CloudEntity>> handler = new CloudCallbackHandler<List<CloudEntity>>() {
        @Override
        public void onComplete(List<CloudEntity> results) {
            for (CloudEntity entity : results) {
                UserLocation loc = new UserLocation(entity);
                mUserLocations.remove(loc);
                mUserLocations.add(loc);
                drawMarkers();
            }
        }

        @Override
        public void onError(IOException e) {
            Toast.makeText(getApplicationContext(), e.getMessage(),
                    Toast.LENGTH_LONG).show();
        }
    };

    CloudQuery query = new CloudQuery("UserLocation");
    query.setLimit(50);
    query.setSort(CloudEntity.PROP_UPDATED_AT, Order.DESC);
    query.setScope(Scope.FUTURE_AND_PAST);
    getCloudBackend().list(query, handler);

使用调试器我已验证getCloudBackend().list()行已执行,但onComplete()方法永远不会被命中,onError()也不会。

以下是一个完美运作的示例:

UserLocation self = new UserLocation(super.getAccountName(),
                gh.encode(mCurrentLocation));
        getCloudBackend().update(self.asEntity(), updateHandler);

基本上,getCloudBackend().update()有效,而getCloudBackend().list()没有。

我还应该补充一点,我已经从教程中链接的github repo下载了完整的源代码,并且该代码存在同样的问题。 我也尝试过多次重新部署后端服务器。

3 个答案:

答案 0 :(得分:5)

好的,所以我终于解决了这个问题!问题出现在清单和班级GCMIntentService.java

在清单中,GCM注册为服务并属于包。默认情况下,此服务是默认包com.google.cloud.backend.android的一部分。当您创建新包并在其中包含所有客户端代码时,您需要将GCMIntentService.java类移动到该新包中,并在清单中修改服务和广播接收器

<service android:name="yourpackagename.GCMIntentService" />
<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="yourpackagename" />
        </intent-filter>
    </receiver>

默认包名称附带的任何其他权限也应更新为主包名称。如果您只打算使用移动后端启动程序附带的默认软件包,则无需修改此项。

关于GoogleAuthIOException,我最初也收到了。所以我重新启动了所有步骤以启用GCM和身份验证。需要注意的是,在注册GCM服务器密钥和Web客户端ID时,我仍然遵循教程并使用Web Application -> Generic。注册Android客户端ID时要记住的另一个关键事项是,使用SHA1指纹时,它还需要一个包名。如果您为项目使用多个包,则包名称必须再次是您的主要客户端包。您可以从旧的Google API控制台获取Consts.java中的项目编号(并且需要注册GCM),并从新的云控制台获取项目ID。 Web客户端ID也在Consts.java文件中,并且在同一个文件中,您必须通过更改

来启用身份验证
public static final boolean IS_AUTH_ENABLED = false;

public static final boolean IS_AUTH_ENABLED = true;

希望这会有所帮助。

答案 1 :(得分:0)

所以我也遇到了同样的问题。 getCloudBackend().update()适用于我,不仅适用于地理位置类,我还尝试使用myLocation.toString()向云发送更新,其中myLocation是LatLng,并且可以更新。

很抱歉没有为您提供问题的实际解决方案。这是一个非常奇怪的情况,相同的确切代码在Google I / O演示中起作用,但是当我们(并且我非常彻底地遵循教程)实际尝试时却没有。如果有的话,我觉得这是一个服务器问题。

答案 2 :(得分:0)

感谢您报告此事 - 抱歉您遇到了问题。最可能的问题是配置GCM。您是否可以验证项目是否已启用GCM以及所有正确完成的设置步骤?也许尝试发送消息,看看是否有效?

相关问题