2013年1月31日木曜日

ACS Android SDKでハマる

ACSでググっても化学とか冠状動脈とかばっかりで、なかなか情報にたどり着けないのが困ったもんです。Appcelerator Cluod ServicesだとTitaniumばっかりだし(当たり前だけど)。ということで、ACS Android SDKでのハマりねた。

■Whereをどう書けば?■

Titanium mobileのSDKと違って、Android SDKはほとんど素のREST API SDKです。iOS SDKだと、あまり便利とはいえないけどCCWhereなんてクラスもあって、それなりにラップしてくれます。でもAndroidだと、こんな感じで書く必要があります。

    Map<String, Object> q = new HashMap<String, Object>();
    q.put("order", "-updated_at");
    q.put("where", "{\"email\":\"" + strEmail + "\"}");
    CCResponse r = sdk.sendRequest("users/query.json", 
                                   CCRequestMethod.GET, q);


…なんかperlでも書いている気分だ…書いたことないけど…。

まぁでも「ほぼREST」だと思ってしまえば、ある意味気は楽です。

ところで、Android 4以降はネットワークアクセスを別スレッドにしないと動いてくれません。

    public void acsThread() {
        listFriendsRequest = null;
            
        new Thread(new Runnable() {
            @Override
            public void run() {
                acsProcess();
            }
        }).start();
    }

そして終了後に画面切り替えたりするにはHandlerを使う必要があります。

以上をひとまとめにしてACSへのログインをActivity上に書くとこんな感じ。会社で使っているコードを貼るわけにはいかないので、記憶などを頼りにADT上で書いたもの。実働ソースではないので、もし不具合が出たらすみません。

    public void acsLogin(String inEmail, String inPassword) {
        final String email    = inEmail;
        final String password = inPassword;
        final Handler handler = new Handler();
        
        final JSONObject result = null;
        
        new Thread(new Runnable() {

            @Override
            public void run() {
                CCResponse r = null;
                
                Map<String, Object> q = new HashMap<String, Object>();
                q.put("login",    email);
                q.put("password", password);
        
                try {
                    r = sdk.sendRequest("users/login.json", 
                                        CCRequestMethod.POST, q);
                    CCMeta m = r.getMeta();
                    if ("ok".equals(m.getStatus()) 
                            && m.getCode() == 200 
                            && "loginUser".equals(m.getMethod())) 
                    {
                        result = r.getResponseData()
                                  .getJSONArray("users")
                                  .getJSONObject(0);
                    }
                }
                catch (CocoafishError e) {
                    e.getMessage();
                }
                catch (IOException e) {
                    e.getMessage();
                }
                catch (Exception ex) {}

                if (result != null) {
                    handler.post(new Runnable() {
                        @Override
                        public void run() {
                            jsonUser = result;
                            Intent intent = new Intent(MainActivity.this, 
                                                       NextActivity.class);
                            startActivity(intent);
                        }
                    });
                }
            }
        }).start();
    }

何かもう1歩あるくたびにつまずいてググらないと進めない。

まぁiOSアプリ書いている時もそうですけどねorz

0 件のコメント:

コメントを投稿