0

https://developers.google.com/cloud/samples/mbs/deploy_backendのガイドに従って、Google のモバイル バックエンド スターターをデプロイしました 。

これらの手順でクライアントを使用してテストしたところ、正常に動作しました。

今、私はからクライアントをダウンロードしました

https://github.com/bradabrams/GeekSerendipity-io13

の手順に従いました

http://bradabrams.com/2013/05/google-io-2013-session-overview-from-nothing-to-nirvana-in-minutes-cloud-backend-for-your-android-application-building-geek-セレンディピティ/

ステップ 3 まで。これまでのところ、地図上に自分の位置が正しく表示されている地図を見ることができます。ただし、AppEngine ログを見ると、次の例外が表示されます。

com.google.api.server.spi.SystemService invokeServiceMethod: cause={0} java.lang.IndexOutOfBoundsException: Index: 1, Size: 1
    at java.util.ArrayList.rangeCheck(ArrayList.java:604)
    at java.util.ArrayList.get(ArrayList.java:382)
    at com.google.cloud.backend.beans.FilterDto.getOperand(FilterDto.java:131)
    at com.google.cloud.backend.beans.FilterDto.getDatastoreFilter(FilterDto.java:99)
    at com.google.cloud.backend.spi.QueryOperations.executeQuery(QueryOperations.java:109)
    at com.google.cloud.backend.spi.QueryOperations.list(QueryOperations.java:84)
    at com.google.cloud.backend.spi.EndpointV1.list(EndpointV1.java:227)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:45)
    at com.google.api.server.spi.SystemService.invokeServiceMethod(SystemService.java:339)
    at com.google.api.server.spi.SystemServiceServlet.execute(SystemServiceServlet.java:163)
    at com.google.api.server.spi.SystemServiceServlet.doPost(SystemServiceServlet.java:121)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:637)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
    at org.mortbay.jetty.servlet.ServletHolder.handle(ServletHolder.java:511)
    at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1166)
    at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
    at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
    at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
    at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
    at org.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler.java:388)
    at org.mortbay.jetty.security.SecurityHandler.handle(SecurityHandler.java:216)
    at org.mortbay.jetty.servlet.SessionHandler.handle(SessionHandler.java:182)
    at org.mortbay.jetty.handler.ContextHandler.handle(ContextHandler.java:765)
    at org.mortbay.jetty.webapp.WebAppContext.handle(WebAppContext.java:418)
    at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152)
    at org.mortbay.jetty.Server.handle(Server.java:326)
    at org.mortbay.jetty.HttpConnection.handleRequest(HttpConnection.java:542)
    at org.mortbay.jetty.HttpConnection$RequestHandler.headerComplete(HttpConnection.java:923)
    at org.mortbay.jetty.HttpConnection.handle(HttpConnection.java:404)
    at com.google.tracing.TraceContext$TraceContextRunnable.runInContext(TraceContext.java:435)
    at com.google.tracing.TraceContext$TraceContextRunnable$1.run(TraceContext.java:442)
    at com.google.tracing.CurrentContext.runInContext(CurrentContext.java:186)
    at com.google.tracing.TraceContext$AbstractTraceContextCallback.runInInheritedContextNoUnref(TraceContext.java:306)
    at com.google.tracing.TraceContext$AbstractTraceContextCallback.runInInheritedContext(TraceContext.java:298)
    at com.google.tracing.TraceContext$TraceContextRunnable.run(TraceContext.java:439)
    at java.lang.Thread.run(Thread.java:722)

なぜこの例外が発生するのですか?

私がチェックしたこと:

  1. Consts.java のプロジェクト ID とプロジェクト番号は正しいです。

  2. Android マニフェストをチェックして、Maps API キーが正しいことを確認しました

  3. コード コンソールで Maps API キーに指定されたパッケージ名は正しいです: ;com.turbomanage.sample.geekwatch

  4. Appengine バックエンドは、単独で正常に動作しています。API エクスプローラーのリンクは次のとおりです。

    http://forward-alchemy-355.appspot.com/_ah/api/explorer

  5. 認証は「OPEN」に設定されているため、何らかの理由でブロックされることはありません。

  6. https://developers.google.com/cloud/samples/mbs/android/に記載されている Android サンプル アプリに対してバックエンドをテストしたためです。バックエンドは正常に動作しているようです。ほとんどの場合、これは Geek Serendipity クライアントが間違ったパラメーターを渡した場合のようです。

  7. Eclipse でコードを調べて、CloudQuery と QueryDto がどのように見えるかを確認しました。

クラウドクエリ:

CloudQuery (Geek/PAST): filter: F: op: EQ, values: [name, null]

クエリ先:

{filterDto={operator=EQ, values=[name, null]}, kindName=Geek, limit=1, regId=APA91bHtELzN0oF2ZtUa91epD7gzxtM8R7EUP7O7w_9ebCxT7bEFbWO9CEhmkulOayXkJ8zRz1eXehfh-ZD4Mru0bug7nbnolrDdzOlbN5orsixKUyyZtMyHOy7MHNfA46gFQEWfvo9FQdCe8fsZ1qlumuyybSgQJw, scope=PAST, sortAscending=false, sortedPropertyName=name}

ここでの問題は values:[name, null] にあると思われます。しかし、これ以上解読できません。このクエリは実際にはどのように見えるべきでしょうか?

アプリの説明に基づいて、ここで利用可能なすべての「Geek」インスタンスをクエリしてマップに表示しようとしている可能性がありますが、Google が提供するこのサンプル コードを詳しく知らないため、そうであるかどうかはわかりません。(私はEndPointsも初めてなので、Geek Serendipityアプリをスターターとして試しています)

また、この時点で、データストアには「Geek」タイプのインスタンスが 0 個あります。

これをデバッグするのに役立つポインタがあれば、本当に感謝しています。

更新: API エクスプローラーから同じクエリを試しました。HTTP 200 OK が返されますが、AppEngine ログにはまだ例外が表示されます。

https://apis-explorer.appspot.com/apis-explorer/?base=https%3A%2F%2Fforward-alchemy-355.appspot.com%2F_ah%2Fapi#p/mobilebackend/v1/mobilebackend.endpointV1.list ?_h=2&resource=%257B%250A++%2522filterDto%2522%253A+%250A++%257B%250A++++%2522operator%2522%253A+%2522EQ%2522%252C%250A++++%2522values%2522%253A+%250%B%2522name222++%25525 252C%2522null%2522%250A++++%255D%250A++%257D%252C%250A++%2522kindName%2522%253A+%2522Geek%2522%252C%250A++%2522regId%2522%253A+%2522APA91bHtELzN0oF2ZtUa91epD7gzxtM8R7EUP7O7w_9ebCxT7bEFbWO9CEhmkulOayXkJ8zRz1eXehfh-ZD4Mru0bug7nbnolrDdzOlbN5orsixKUyyZtMyHOy7MHNfA46gFQEWfvo9FQdCe8fsZ1qlumuyybSgQJw%2522%252C%250A++%2522scope% 2522%253A+%2522PAST%2522%252C%250A++%2522sortAscending%2522%253A+false%252C%250A++%2522sortedPropertyName%2522%253A+%2522name%2522%250A%257D&

実際、クエリから {filterDto={operator=EQ, values=[name, null]} を削除しても、ログにエラーが表示されます。

これは無害なバグであり、不必要に心配しているのだろうかと思い始めています。残りの手順を続行し、他に問題が発生するかどうかを確認します。

4

1 に答える 1

1

Geek Serendipity Android Client コードのソース コードを使用している場合は、アプリが動作するかどうかを確認するためにすべてのステップで停止しないでください。

認証の設定が完了するまで機能しません。そのように設計されています。最終製品です。

詳細な説明は次のとおりです。

上記のエラーでは、JSON クエリで次のことを言及しました。

operator=EQ, values=[name, null]

このクエリを生成するコードは次のとおりです。

getCloudBackend().listByProperty("Geek", "name", Op.EQ,
                                        accountName, null, 1, Scope.PAST,
                                        new CloudCallbackHandler<List<CloudEntity>>() {...

つまり、次のように変換する必要があります。

operator=EQ, values=[name, "somefunkyuser@gmail.com"]

ただし、この時点で認証を設定していなかったため、そうではありませんでした。つまり、Consts.java では、「IS_AUTH_ENABLED」を「true」にする必要があります。また、http ://bradabrams.com/2013/05/で指定されているとおりに「Web クライアント ID」キーを生成して追加する必要があります。google-io-2013-session-overview-from-nothing-to-nirvana-in-minutes-cloud-backend-for-your-android-application-building-geek-serendipity/

指示に従って、ページの最後まで続けてください。ページの最後までたどり着いたら、正しくたどっていれば、アプリをテストしてみてください。動作するはずです。

追記:

Android アプリケーションの「CLIENT ID」を生成するときは、クラウド コンソールで「アプリケーションの登録」を 2 回行ってください。

  1. 最初のものには、プラットフォーム「Android」を選択します。これにはパッケージ名が必要です。

  2. 2 つ目は、プラットフォーム「Web」を選択します。これにより、Web クライアント ID が得られますが、Android アプリにも必要です。(Consts.java ファイルには、「Android クライアント ID」ではなく、「Web クライアント ID」が必要です。一方、MBS 認証ページでは、Android クライアント ID と Web クライアント ID の両方が必要であり、 Android アプリ)

于 2013-10-05T08:06:20.207 に答える