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

标签 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 存储库下载了完整的源代码,该代码也存在同样的问题。 我也多次尝试重新部署后端服务器。

最佳答案

好的,我终于解决了这个问题!问题既存在于 list 中,也存在于类 GCMIntentService.java

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

<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 服务器 key 和 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;

希望这对您有所帮助。

关于android - 移动后端启动器连续查询永不返回,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17714734/

相关文章:

android - 如何在Android中阅读/打开PPT文件?

java - 使用异步任务处理来自 mssql 数据库的大数据

java - Android操作栏样式生成器: Change text color of action bar

java - “com.google.appengine.api.backends.BackendService”已被弃用

django - 使用 Django 在 Google 应用程序引擎中上传文件

python - AppEngine 计费即将发生的变化是否意味着异步批量操作将比当前计费模型便宜得多?

android - 对 JDK 6 编译的 jar 文件进行 Dex 化时出现 "bad class file magic"错误

android - 推送通知未打开正确的屏幕

android - 在 Android 中使用注册 ID 从 GCM 注销设备

push-notification - Xamarin.Forms Azure 推送通知 - "MobileServiceInvalidOperationException: You do not have permission to view this directory or page"