{"id":243,"date":"2010-08-09T17:57:11","date_gmt":"2010-08-09T08:57:11","guid":{"rendered":"http:\/\/www.typea.info\/blog\/index.php\/2010\/08\/09\/android_google_gae\/"},"modified":"2010-08-09T17:57:11","modified_gmt":"2010-08-09T08:57:11","slug":"android_google_gae","status":"publish","type":"post","link":"https:\/\/www.typea.info\/blog\/index.php\/2010\/08\/09\/android_google_gae\/","title":{"rendered":"Android \u30a2\u30d7\u30ea\u304b\u3089 Google \u30a2\u30ab\u30a6\u30f3\u30c8\u3092\u5229\u7528\u3057\u3066 GAE \u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u3092\u5229\u7528\u3059\u308b"},"content":{"rendered":"<p><a href=\"\/blg\/glob\/2010\/08\/android_gae_windows7.html\">Android \u3068 GAE \u3092\u540c\u6642\u306b Ecliipse \u304b\u3089\u30c7\u30d0\u30c3\u30b0\u3059\u308b\u74b0\u5883\u306f\u51fa\u6765\u305f<\/a>\u306e\u3067\u3001Google \u30a2\u30ab\u30a6\u30f3\u30c8\u3092 Android \u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u304b\u3089\u5229\u7528\u3057\u3066\u307f\u308b\u3002<\/p>\n<h2>GAE \u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u5074\u3067\u30ed\u30b0\u30a4\u30f3\u72b6\u614b\u3092\u5224\u5b9a<\/h2>\n<p><a href=\"https:\/\/www.typea.info\/blog\/wp-content\/uploads\/image\/AndroidGoogleGAE_E9A8\/android_gae_07.jpg\" target=\"_blank\"><img loading=\"lazy\" decoding=\"async\" style=\"border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px\" title=\"android_gae_07\" border=\"0\" alt=\"android_gae_07\" src=\"https:\/\/www.typea.info\/blog\/wp-content\/uploads\/image\/AndroidGoogleGAE_E9A8\/android_gae_07_thumb.jpg\" width=\"283\" height=\"157\" \/><\/a> <\/p>\n<h3>typea_android_apps.py<\/h3>\n<p>\/cardroid \u3068\u3044\u3046\u30ea\u30af\u30a8\u30b9\u30c8\u304c\u6765\u305f\u3089\u3001cardroid \u30d1\u30c3\u30b1\u30fc\u30b8 cardroid_request_handler \u30e2\u30b8\u30e5\u30fc\u30eb\u306e InitialCardroidPage \u30af\u30e9\u30b9\u3092\u547c\u3073\u51fa\u3059\u3088\u3046\u306b\u8a2d\u5b9a<\/p>\n<pre class=\"prettyprint linenums\">from google.appengine.ext import webapp\r\nfrom google.appengine.ext.webapp.util import run_wsgi_app\r\n\r\nfrom cardroid import cardroid_request_handler as cardroid_handler\r\n\r\nclass MainPage(webapp.RequestHandler):\r\n    def get(self):\r\n        self.response.headers['Content-Type'] = 'text\/plain'\r\n        self.response.out.write('Hello, webapp World!')\r\n\r\napplication = webapp.WSGIApplication([\r\n                                      ('\/', MainPage), \r\n                                      ('\/cardroid', cardroid_handler.InitialCardroidPage),\r\n                                     ], debug=True)\r\ndef main():\r\n    run_wsgi_app(application)\r\n\r\nif __name__ == &quot;__main__&quot;:\r\n    main()<\/pre>\n<h3>cardroid_request_handler.py<\/h3>\n<p>\u30e6\u30fc\u30b6\u30fc\u304c\u30ed\u30b0\u30a4\u30f3\u72b6\u614b\u3067\u3042\u308c\u3070\u3001\u30e6\u30fc\u30b6\u30fc\u306e\u30cb\u30c3\u30af\u30cd\u30fc\u30e0\u3068\u30ed\u30b0\u30a2\u30a6\u30c8\u306e\u30ea\u30f3\u30af \u3092\u8fd4\u3057\u3001\u305d\u3046\u3067\u306a\u3051\u308c\u3070\u3001\u30ed\u30b0\u30a4\u30f3\u30da\u30fc\u30b8\u3078\u306e\u30ea\u30f3\u30af\u3092\u8fd4\u3059\u3088\u3046\u306b\u3059\u308b\u3002<\/p>\n<pre class=\"prettyprint linenums\">from google.appengine.ext import webapp\r\nfrom google.appengine.api import users\r\n\r\nclass InitialCardroidPage(webapp.RequestHandler):\r\n    def get(self):\r\n        self.post()\r\n        \r\n    def post(self):\r\n        user = users.get_current_user()\r\n        if user:\r\n            user_logout_url = users.create_logout_url(&quot;\/&quot;)\r\n            return self.response.out.write(&quot;&lt;html&gt;%s &lt;a href=&quot;%s&quot;&gt;logout&lt;\/a&gt;&quot; % (user.nickname(), user_logout_url));\r\n        else:\r\n            user_login_url  = users.create_login_url('\/cardroid')\r\n            return self.response.out.write(&quot;&lt;html&gt;&lt;a href=&quot;%s&quot;&gt;login&lt;\/a&gt;&quot; % (user_login_url));<\/pre>\n<h3>PC\u306e\u30d6\u30e9\u30a6\u30b6\u304b\u3089\u78ba\u8a8d<\/h3>\n<h4>\u672a\u30ed\u30b0\u30a4\u30f3\u72b6\u614b\u306e\u5834\u5408\u3001\u30ed\u30b0\u30a4\u30f3\u306e\u30ea\u30f3\u30af\u3092\u8868\u793a<\/h4>\n<p><a href=\"https:\/\/www.typea.info\/blog\/wp-content\/uploads\/image\/AndroidGoogleGAE_E9A8\/android_gae_08.jpg\" target=\"_blank\"><img loading=\"lazy\" decoding=\"async\" style=\"border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px\" title=\"android_gae_08\" border=\"0\" alt=\"android_gae_08\" src=\"https:\/\/www.typea.info\/blog\/wp-content\/uploads\/image\/AndroidGoogleGAE_E9A8\/android_gae_08_thumb.jpg\" width=\"244\" height=\"158\" \/><\/a><\/p>\n<h4>\u30ed\u30b0\u30a4\u30f3\u3059\u308b<\/h4>\n<p><a href=\"https:\/\/www.typea.info\/blog\/wp-content\/uploads\/image\/AndroidGoogleGAE_E9A8\/android_gae_09.jpg\" target=\"_blank\"><img loading=\"lazy\" decoding=\"async\" style=\"border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px\" title=\"android_gae_09\" border=\"0\" alt=\"android_gae_09\" src=\"https:\/\/www.typea.info\/blog\/wp-content\/uploads\/image\/AndroidGoogleGAE_E9A8\/android_gae_09_thumb.jpg\" width=\"244\" height=\"143\" \/><\/a><\/p>\n<h4>\u30e6\u30fc\u30b6\u30fc\u306e\u30cb\u30c3\u30af\u30cd\u30fc\u30e0\u3068\u30ed\u30b0\u30a2\u30a6\u30c8\u306e\u30ea\u30f3\u30af\u3092\u8868\u793a<\/h4>\n<p>&#160;<a href=\"https:\/\/www.typea.info\/blog\/wp-content\/uploads\/image\/AndroidGoogleGAE_E9A8\/android_gae_10.jpg\" target=\"_blank\"><img loading=\"lazy\" decoding=\"async\" style=\"border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px\" title=\"android_gae_10\" border=\"0\" alt=\"android_gae_10\" src=\"https:\/\/www.typea.info\/blog\/wp-content\/uploads\/image\/AndroidGoogleGAE_E9A8\/android_gae_10_thumb.jpg\" width=\"244\" height=\"148\" \/><\/a> <\/p>\n<\/p>\n<\/p>\n<h2>Android \u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u304b\u3089 Google \u30a2\u30ab\u30a6\u30f3\u30c8\u3092\u5229\u7528\u3057\u3066 GAE \u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u3092\u547c\u3073\u51fa\u3059\u3002<\/h2>\n<p>\u3053\u306e\u3042\u305f\u308a\u3092\u53c2\u8003\u306b\u3002<\/p>\n<ul>\n<li><a href=\"http:\/\/github.com\/Arachnid\/AEAuth\/blob\/master\/src\/net\/notdot\/aeauth\/AppInfo.java\">http:\/\/github.com\/Arachnid\/AEAuth\/blob\/master\/src\/net\/notdot\/aeauth\/AppInfo.java<\/a> <\/li>\n<li><a href=\"http:\/\/blog.notdot.net\/2010\/05\/Authenticating-against-App-Engine-from-an-Android-app\">http:\/\/blog.notdot.net\/2010\/05\/Authenticating-against-App-Engine-from-an-Android-app<\/a> <\/li>\n<li><a href=\"http:\/\/chrometophone.googlecode.com\/svn-history\/r26\/trunk\/android\/src\/com\/google\/android\/apps\/chrometophone\/DeviceRegistrar.java\">http:\/\/chrometophone.googlecode.com\/svn-history\/r26\/trunk\/android\/src\/com\/google\/android\/apps\/chrometophone\/DeviceRegistrar.java<\/a><\/li>\n<\/ul>\n<p>\n  <\/p>\n<h2>GaeUtil \u30af\u30e9\u30b9<\/h2>\n<p>\u3068\u308a\u3042\u3048\u305a\u3001GAE \u95a2\u4fc2\u3067\u5229\u7528\u3059\u308b\u30af\u30e9\u30b9\u3092\u307e\u3068\u3081\u308b\u305f\u3081\u306b\u4f5c\u6210\u3002<a href=\"\/blg\/glob\/2010\/06\/java_static.html\">Static \u30af\u30e9\u30b9\u306e\u4fbf\u5229\u3055\u306b\u9045\u308c\u3070\u305b\u306a\u304c\u3089\u6c17\u304c\u3064\u3044\u305f<\/a>\u306e\u3067\u3001\u4f7f\u3044\u307e\u304f\u308a\u3002<\/p>\n<p>\u7279\u306b\u610f\u5473\u306f\u7121\u3044\u3002<\/p>\n<h2>PracticeUploader <\/h2>\n<p>\u540d\u524d\u306f\u3001\u81ea\u5206\u304c\u4f5c\u3063\u3066\u3044\u308b\u30a2\u30d7\u30ea\u306b\u3061\u306a\u3093\u3067\u3044\u308b\u3060\u3051\u3067\u3053\u3061\u3089\u3082\u610f\u5473\u306f\u7121\u3044\u3002upload() \u30e1\u30bd\u30c3\u30c9\u306e\u4e2d\u304b\u3089\u304c\u672c\u7b4b\u3002<\/p>\n<h3>AccountManager<\/h3>\n<p>getAccounts() \u30e1\u30bd\u30c3\u30c9\u3092\u5229\u7528\u3059\u308b\u3068\u3001Android \u7aef\u672b\u3067\u7ba1\u7406\u3057\u3066\u3044\u308b\u30a2\u30ab\u30a6\u30f3\u30c8\u60c5\u5831\u304c\u53d6\u5f97\u3067\u304d\u308b\u3088\u3046\u3060\u3002<\/p>\n<p><a href=\"https:\/\/www.typea.info\/blog\/wp-content\/uploads\/image\/AndroidGoogleGAE_E9A8\/android_gae06.png\" target=\"_blank\"><img loading=\"lazy\" decoding=\"async\" style=\"border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px\" title=\"android_gae06\" border=\"0\" alt=\"android_gae06\" src=\"https:\/\/www.typea.info\/blog\/wp-content\/uploads\/image\/AndroidGoogleGAE_E9A8\/android_gae06_thumb.png\" width=\"148\" height=\"244\" \/><\/a> <\/p>\n<p>\u3053\u308c\u3089\u306d\u3002<\/p>\n<p>\u3067\u3001\u305d\u308c\u305e\u308c\u306e\u30a2\u30ab\u30a6\u30f3\u30c8\u306f type \u60c5\u5831\u3092\u6301\u3063\u3066\u3044\u3066\u3001getAccountsByType(&quot;com.google&quot;)&#160; \u3067\u3001Google \u30a2\u30ab\u30a6\u30f3\u30c8\u306e\u60c5\u5831\u304c\u3068\u308c\u3066\u304f\u308b\u3002<\/p>\n<p>\u3068\u308a\u3042\u3048\u305a\u3001\u6dfb\u3048\u5b57=0 \u306e\u5024\u3092\u5229\u7528\u3057\u3066\u3044\u308b\u304c\u3001\u30de\u30eb\u30c1\u30a2\u30ab\u30a6\u30f3\u30c8\u3060\u3068\u8907\u6570\u4ef6\u3068\u308c\u3066\u304f\u308b\u306e\u304b\u306a\uff1f<\/p>\n<p>\u305d\u306e\u5834\u5408\u3001\u9078\u629e\u3055\u305b\u308b\u4ed5\u7d44\u307f\u3082\u5fc5\u8981\u304b\u3082\u3002<\/p>\n<p>\u3067\u3001getAuthToken() \u30e1\u30bd\u30c3\u30c9\u3092\u5229\u7528\u3057\u3066\u3001\u8a8d\u8a3c\u7528\u306e\u30c8\u30fc\u30af\u30f3\u3092\u53d6\u5f97\u3002<\/p>\n<p>\u53d6\u5f97\u3057\u305f\u30a2\u30ab\u30a6\u30f3\u30c8\u30aa\u30d6\u30b8\u30a7\u30af\u30c8\u3068\u3001&quot;ah&quot; \u3068 \u30b3\u30fc\u30eb\u30d0\u30c3\u30af\u7528\u306e\u30a4\u30f3\u30b9\u30bf\u30f3\u30b9\u3092\u6e21\u3059\u3002<\/p>\n<p>Google \u30a2\u30ab\u30a6\u30f3\u30c8\u306f &quot;ah&quot;&#160; \u306e\u3088\u3046\u3060\u3002\u8a8d\u8a3c\u7528\u306e\u30c8\u30fc\u30af\u30f3\u304c\u53d6\u5f97\u3067\u304d\u305f\u3089\u3001\u6e21\u3057\u305f\u30a4\u30f3\u30b9\u30bf\u30f3\u30b9\u304c\u30b3\u30fc\u30eb\u30d0\u30c3\u30af\u3055\u308c\u308b\u3002<\/p>\n<h3>UploadPracticeCallback <\/h3>\n<p>\u3053\u306e\u30af\u30e9\u30b9\u3082\u540d\u524d\u306f\u610f\u5473\u304c\u306a\u3044(\u3068\u3044\u3046\u304b\u81ea\u5206\u5411\u3051)\u3001\u4e0a\u8a18\u3067\u53c2\u7167\u3057\u305f\u30b3\u30fc\u30c9\u7b49\u306f\u3001\u975e\u540c\u671f\u3067\u51e6\u7406\u3092\u884c\u3063\u305f\u308a\u3057\u3066\u3044\u308b\u304c\u3001\u307e\u305a\u306f\u6319\u52d5\u78ba\u8a8d\u306e\u305f\u3081\u3001\u3079\u305f\u66f8\u304d\u3059\u308b\u3002<\/p>\n<p>\u3069\u3046\u3084\u3089\u3001\u8a8d\u8a3c\u304c\u521d\u56de\u7b49\u5fc5\u8981\u306a\u5834\u5408\u306f\u3001Intent intent = (Intent)bundle.get(AccountManager.KEY_INTENT);&#160; \u3067 Intent \u304c\u53d6\u5f97\u3067\u304d\u308b\u3088\u3046\u306a\u306e\u3067\u3001startActivity \u3057\u3066\u3042\u3052\u308b\u3068\u3001\u8a8d\u8a3c\u3092\u78ba\u8a8d\u3059\u308b\u753b\u9762\u304c\u8868\u793a\u3055\u308c\u308b\u3002<\/p>\n<p><a href=\"https:\/\/www.typea.info\/blog\/wp-content\/uploads\/image\/AndroidGoogleGAE_E9A8\/android_gae03.png\" target=\"_blank\"><img loading=\"lazy\" decoding=\"async\" style=\"border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px\" title=\"android_gae03\" border=\"0\" alt=\"android_gae03\" src=\"https:\/\/www.typea.info\/blog\/wp-content\/uploads\/image\/AndroidGoogleGAE_E9A8\/android_gae03_thumb.png\" width=\"164\" height=\"270\" \/><\/a> <\/p>\n<p>\u8a8d\u8a3c\u3055\u308c\u3066\u3044\u308c\u3070\u3001String authToken = bundle.getString(AccountManager.KEY_AUTHTOKEN); \u3067\u3001\u8a8d\u8a3c\u30c8\u30fc\u30af\u30f3\u304c\u53d6\u5f97\u3067\u304d\u308b\u3002<\/p>\n<h4>Cookie \u306e\u4fdd\u6301<\/h4>\n<p>&#160; \u8a8d\u8a3c\u30c8\u30fc\u30af\u30f3\u3092\u542b\u3081\u3066\u3001GAE \u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u3078 \u4ee5\u4e0b\u306e\u611f\u3058\u3067GET \u30ea\u30af\u30a8\u30b9\u30c8\u3092\u6295\u3052\u308b\u3002 <\/p>\n<p><a href=\"https:\/\/{ GAE\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3URL }\/_ah\/login?continue={ \u8a8d\u8a3c\u5f8c\u306b\u9077\u79fb\u3059\u308bURL }&amp;auth={ \u8a8d\u8a3c\u30c8\u30fc\u30af\u30f3 }\">https:\/\/{ GAE\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3URL }\/_ah\/login?continue={ \u8a8d\u8a3c\u5f8c\u306b\u9077\u79fb\u3059\u308bURL }&amp;auth={ \u8a8d\u8a3c\u30c8\u30fc\u30af\u30f3 }<\/a> <\/p>\n<p>http \u304b\u3001https \u304b\u306b\u3088\u3063\u3066\u3001Cookie \u306b &quot;ACSID&quot; \u307e\u305f\u306f\u3001&quot;SACSID&quot; \u306e\u30ad\u30fc\u304c\u8a2d\u5b9a\u3055\u308c\u3066\u304f\u308b\u306e\u3067\u3001\u4fdd\u6301\u3057\u3066\u304a\u304f\u3002 <\/p>\n<h4>&#160;<\/h4>\n<h4>\u5b9f\u969b\u306e\u30ea\u30af\u30a8\u30b9\u30c8<\/h4>\n<p>\u3053\u308c\u3067\u3001\u5b9f\u969b\u306b\u3084\u308a\u305f\u3044\u30ea\u30af\u30a8\u30b9\u30c8\u3092\u6295\u3052\u308b\u6e96\u5099\u304c\u6574\u3063\u305f\u3002<\/p>\n<p>\u4e0a\u8a18\u3067\u4fdd\u6301\u3057\u305f Cookie \u3092\u4ed8\u52a0\u3057\u3066\u3001POST \u30e1\u30bd\u30c3\u30c9\u3092\u6295\u3052\u308b\u3002<\/p>\n<p>\u30ed\u30b0\u30a4\u30f3\u72b6\u614b\u306b\u306a\u3063\u3066\u3044\u308c\u3070\u3001\u30cb\u30c3\u30af\u30cd\u30fc\u30e0\u304c\u6b63\u3057\u304f LogCat \u306b\u306f\u304b\u308c\u308b\u306f\u305a\u3002<\/p>\n<p>&#160;<\/p>\n<h3><font color=\"#ff0000\">\u554f\u984c\u70b9<\/font><\/h3>\n<p><font color=\"#ff0000\">\u4ee5\u4e0b\u3001GAE \u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u3092\u3001\u30ea\u30ea\u30fc\u30b9\u3057\u3066\u78ba\u8a8d\u3057\u305f\u3002<\/font><a href=\"\/blg\/glob\/2010\/08\/android_gae_windows7.html\"><font color=\"#ff0000\">\u958b\u767a\u74b0\u5883\u3067\u30c7\u30d0\u30c3\u30b0\u3057\u305f\u3044<\/font><\/a><font color=\"#ff0000\"> \u306e\u3060\u304c\u3001\u73fe\u6642\u70b9\u3067\u306f\u3069\u3046\u3057\u3066\u3044\u3044\u306e\u304b\u308f\u304b\u3089\u3093\u3002<\/font><\/p>\n<p><font color=\"#ff0000\" size=\"3\"><strong>&#160;<\/strong><\/font><a href=\"https:\/\/www.typea.info\/blog\/index.php\/2010\/09\/08\/android_gae\"><font color=\"#ff0000\" size=\"3\"><strong>==&gt; 2010\/09\/08 \u89e3\u6c7a(?) \u3057\u307e\u3057\u305f\uff01<\/strong><\/font><\/a><\/p>\n<p><a href=\"https:\/\/www.typea.info\/blog\/wp-content\/uploads\/image\/AndroidGoogleGAE_E9A8\/android_gae_11.jpg\" target=\"_blank\"><img loading=\"lazy\" decoding=\"async\" style=\"border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px\" title=\"android_gae_11\" border=\"0\" alt=\"android_gae_11\" src=\"https:\/\/www.typea.info\/blog\/wp-content\/uploads\/image\/AndroidGoogleGAE_E9A8\/android_gae_11_thumb.jpg\" width=\"741\" height=\"105\" \/><\/a> <\/p>\n<p>\u304a\u3001\u6765\u307e\u3057\u305f\u3002\u3068\u308a\u3042\u3048\u305a\u3001\u6210\u529f\uff01\uff01<\/p>\n<p>\u958b\u767a\u74b0\u5883\u3067\u3069\u3046\u3084\u308b\u304b\u306f\u3001\u4eca\u5f8c\u306e\u8ab2\u984c\u3002<\/p>\n<p>\u30c7\u30d0\u30c3\u30b0\u30e2\u30fc\u30c9\u3068\u30ea\u30ea\u30fc\u30b9\u30e2\u30fc\u30c9\u3067\u30b3\u30fc\u30c9\u306e\u5207\u308a\u66ff\u3048\u304c\u5fc5\u8981\u306b\u306a\u3063\u305f\u308a\u3059\u308b\u306e\u304b\u306a\u3041\u3002<\/p>\n<pre class=\"prettyprint linenums\">package info.typea.cardroid;\r\n\r\nimport java.io.BufferedReader;\r\nimport java.io.IOException;\r\nimport java.io.InputStream;\r\nimport java.io.InputStreamReader;\r\n\r\nimport org.apache.http.Header;\r\nimport org.apache.http.HttpResponse;\r\nimport org.apache.http.client.methods.HttpGet;\r\nimport org.apache.http.client.methods.HttpPost;\r\nimport org.apache.http.client.params.ClientPNames;\r\nimport org.apache.http.cookie.Cookie;\r\nimport org.apache.http.impl.client.DefaultHttpClient;\r\n\r\nimport android.accounts.Account;\r\nimport android.accounts.AccountManager;\r\nimport android.accounts.AccountManagerCallback;\r\nimport android.accounts.AccountManagerFuture;\r\nimport android.accounts.AuthenticatorException;\r\nimport android.accounts.OperationCanceledException;\r\nimport android.content.Context;\r\nimport android.content.Intent;\r\nimport android.os.Bundle;\r\nimport android.util.Log;\r\nimport android.widget.Toast;\r\n\r\npublic class GaeUtil {\r\n    \/**\r\n     * \r\n     *\/\r\n    public static class PracticeUploader {\r\n        private Context context;\r\n        public PracticeUploader(Context context) {\r\n            this.context = context;\r\n        }\r\n        public void upload() {\r\n            AccountManager accountManager = AccountManager.get(context);\r\n            Account[] accounts = accountManager.getAccountsByType(&quot;com.google&quot;);\r\n            \r\n            if (accounts.length &gt;= 0) {\r\n                Account account = accounts[0];\r\n                accountManager.getAuthToken(account, \r\n                                            &quot;ah&quot;, \r\n                                            false, \r\n                                            new UploadPracticeCallback(this.context), \r\n                                            null);\r\n            }\r\n        }\r\n    }\r\n    \r\n    \/**\r\n     *\r\n     *\/\r\n    public static class UploadPracticeCallback implements AccountManagerCallback<bundle> {\r\n        private final String GAE_APP_URI = &quot;http:\/\/typea-android-apps.appspot.com&quot;;\r\n        \r\n        private Context context;\r\n        public UploadPracticeCallback(Context context) {\r\n            this.context = context;\r\n        }\r\n        @Override\r\n        public void run(AccountManagerFuture<bundle> result) {\r\n            Bundle bundle;\r\n            try {\r\n                bundle = result.getResult();\r\n                Intent intent = (Intent)bundle.get(AccountManager.KEY_INTENT);\r\n                if (intent != null) {\r\n                    this.context.startActivity(intent);\r\n                } else {\r\n                    String authToken = bundle.getString(AccountManager.KEY_AUTHTOKEN);\r\n\r\n                    DefaultHttpClient client = new DefaultHttpClient();\r\n                    client.getParams().setBooleanParameter(ClientPNames.HANDLE_REDIRECTS, false);\r\n\r\n                    String uri = GAE_APP_URI + &quot;\/_ah\/login?continue=\/cardroid&amp;auth=&quot; + authToken;\r\n                    \r\n                    HttpGet httpGet = new HttpGet(uri);\r\n                    HttpResponse response = client.execute(httpGet);\r\n                    String acsid = null;\r\n                    for (Cookie cookie : client.getCookieStore().getCookies()) {\r\n                        if (&quot;SACSID&quot;.equals(cookie.getName()) ||\r\n                                &quot;ACSID&quot;.equals(cookie.getName())) {\r\n                            acsid = cookie.getName() + &quot;=&quot; + cookie.getValue();\r\n                        }\r\n                    }\r\n                    \r\n                    uri = GAE_APP_URI + &quot;\/cardroid&quot;;\r\n                    \r\n                    HttpPost httpPost = new HttpPost(uri);\r\n                    httpPost.setHeader(&quot;Cookie&quot;, acsid);\r\n                    \r\n                    response = client.execute(httpPost);\r\n                    InputStream in = response.getEntity().getContent();\r\n                    BufferedReader reader = new BufferedReader(new InputStreamReader(in));\r\n                        String l = null;\r\n                        while((l = reader.readLine()) != null) {\r\n                            Log.i(&quot;MyApp&quot;,l);\r\n                    }\r\n                }\r\n            } catch (OperationCanceledException e) {\r\n                showMessage(R.string.lbl_operation_canceled);\r\n            } catch (AuthenticatorException e) {\r\n                showMessage(R.string.lbl_authenticator_failed);\r\n            } catch (IOException e) {\r\n                showMessage(R.string.lbl_error);\r\n            }\r\n        }\r\n        \/**\r\n         * @param resId\r\n         *\/\r\n        private void showMessage(int resId) {\r\n            (Toast.makeText(this.context,resId, Toast.LENGTH_LONG)).show();\r\n        }\r\n    }\r\n}<\/pre>\n<p>&#160;&#160; <\/p>\n<\/p>\n<\/p>\n<p>\u4ee5\u4e0a\u3002<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Android \u3068 GAE \u3092\u540c\u6642\u306b Ecliipse \u304b\u3089\u30c7\u30d0\u30c3\u30b0\u3059\u308b\u74b0\u5883\u306f\u51fa\u6765\u305f\u306e\u3067\u3001Google \u30a2\u30ab\u30a6\u30f3\u30c8\u3092 Android \u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u304b\u3089\u5229\u7528\u3057\u3066\u307f\u308b\u3002 GAE \u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u5074\u3067\u30ed\u30b0\u30a4\u30f3\u72b6\u614b\u3092\u5224\u5b9a t [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"sns_share_botton_hide":"","vkExUnit_sns_title":"","_vk_print_noindex":"","sitemap_hide":"","_veu_custom_css":"","veu_display_promotion_alert":"","vkexunit_cta_each_option":"","footnotes":""},"categories":[39,19],"tags":[],"class_list":["post-243","post","type-post","status-publish","format-standard","hentry","category-android","category-googleappengine"],"veu_head_title_object":{"title":"","add_site_title":""},"_links":{"self":[{"href":"https:\/\/www.typea.info\/blog\/index.php\/wp-json\/wp\/v2\/posts\/243","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.typea.info\/blog\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.typea.info\/blog\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.typea.info\/blog\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.typea.info\/blog\/index.php\/wp-json\/wp\/v2\/comments?post=243"}],"version-history":[{"count":0,"href":"https:\/\/www.typea.info\/blog\/index.php\/wp-json\/wp\/v2\/posts\/243\/revisions"}],"wp:attachment":[{"href":"https:\/\/www.typea.info\/blog\/index.php\/wp-json\/wp\/v2\/media?parent=243"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.typea.info\/blog\/index.php\/wp-json\/wp\/v2\/categories?post=243"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.typea.info\/blog\/index.php\/wp-json\/wp\/v2\/tags?post=243"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}