3

根据教程,我已经为移动后端启动应用程序编写了一个 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 下载了完整的源代码,并且该代码存在同样的问题。我也尝试过多次重新部署后端服务器。

4

3 回答 3

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 和身份验证。不过要记住的是,Web Application -> Generic在注册 GCM 服务器密钥和 Web 客户端 ID 时,我仍然按照教程进行操作。注册 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;

希望这可以帮助。

于 2013-07-19T13:16:06.800 回答
0

所以我也遇到了和你一样的问题。getCloudBackend().update()对我有用,不仅适用于 geohasher 类,我还尝试将更新发送到云,myLocation.toString()其中 myLocation 是 LatLng 并且更新正常。

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

于 2013-07-18T07:57:36.347 回答
0

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

于 2013-07-18T23:51:18.243 回答