2013年12月18日水曜日

imgurを利用したアップロードライブラリ(Android)

imgurとは

画像共有サイトです。
アップロード機能があるのですが、APIが公開されているので、簡単にアップロードができるAndroidライブラリプロジェクトを作りました。

android-library-imgur-UploadHelper



設定

まずは、imgur apiを使うためにアカウント登録して、
Client ID と Secret IDを発行しなければなりません。

登録したら、このリポジトリからソースを落としてください。

ライブラリプロジェクトなので、組み込みたいプロジェクトのプロパティから追加してく設定してください。



ソース
UploadHelper helper = new UploadHelper(this, this);
                helper.setClientId("YOUR_CLIENT_ID");
                helper.setSecretId("YOUR_SECRET_ID");

                helper.uploadData(imageReturnedIntent.getData());

基本的には使用したいActivity内で、上記の設定とimplements methodを書けば使えます。
インスタンス作成時にViewを渡せば、通信中はそのViewを押せなくすることもできます。uploadDataの引数はUriです。
第2, 3引数に文字列を渡せば、通信ダイアログのタイトルとメッセージを設定できます。
成功すればsuccess methodがcallbackで呼ばれます。



課題

とりあえずGithubで公開したい!という気持ちが先走って、エラーハンドリングがうまくできていなかったり、バグがあったりします汗
Oauth認証の部分も、ほとんどimgurのサンプルのまんまです。

画面も回転させると、通信中のダイアログが消えてしまいます(通信は継続)。
Utilityも充実してないし。
pull request、改善案などをお待ちしております。


参考

Github ImgurAPIv3ExampleAndroid

2013年10月3日木曜日

Androidでxmlをjsonに変換(JSONICを利用)

レスポンスの生xmlをjsonに変換したい

hoge.xmlなどのxmlファイルをjsonへ変換する方法は簡単に見つかったのですが、
通信結果などのレスポンスの生xml(表現あってんのか?)jsonに変換する方法があまり引っかからなかったのでメモ。
AmazonのProduct Advertising APIのレスポンスがxmlだったので使うことになりました。


JSONICをインポート

こちらからダウンロードできます。
ダウンロードしたjarファイルは、libフォルダに入れてください。

JSONICのメソッドは
JSON.encode(Document docment)
を利用します。



サンプルコード

staticメソッドですのでこのままコピペで動きます。
引数や返り値は適宜変更してください。

 public static JSONArray responseToJson(HttpResponse res) {
  if (res == null){
   return null;
  }
  HttpEntity httpEntity = res.getEntity();
  JSONArray jsonArray = null;

  try {
   String xml = EntityUtils.toString(httpEntity, "UTF-8");
   Log.d("convert", "xml= "+ xml);
   DocumentBuilderFactory docFactory = DocumentBuilderFactory.newInstance();
   DocumentBuilder docBuilder = docFactory.newDocumentBuilder();
   Document doc = docBuilder.parse(new InputSource(new ByteArrayInputStream(xml.getBytes("UTF-8"))));
   String json = JSON.encode(doc);
   Log.d("convert", "json= "+ json);
   jsonArray = new JSONArray(json);
  } catch (JSONException e) {
   e.printStackTrace();
  } catch (ParseException e) {
   e.printStackTrace();
  } catch (IOException e) {
   e.printStackTrace();
  } catch (ParserConfigurationException e) {
   e.printStackTrace();
  } catch (SAXException e) {
   e.printStackTrace();
  }
  return jsonArray;
 }



参考

JSONIC - simple json encoder/decoder for java 
StackOverFlow java.net.MalformedURLException: no protocol

2013年3月24日日曜日

FacebookのjavascriptSDKとUIWebViewでの落とし穴

FB.login()を使うとブランクが残る

いくつも関数が用意されているのですが、ログインのために開いたWindowが自動で閉じません。
そのため、白いブランク画面が表示されたままで遷移が止まってしまいます。

ログインは、window.locationとリダイレクトURLを自前設定することで、FBログインののち、用意している画面にリダイレクトさせることができます。



サンプルコード
 


login





  window.fbAsyncInit = function() {
    var stat = "";
    var hostUrl = "http://foo.bar/login.html";
    var appId = "xxxxxxxxxxxxxxx";
    var permission = "user_about_me,user_photos,user_birthday,user_location";

    // init the FB JS SDK
    FB.init({
      appId      : appId, // App ID from the App Dashboard
      status     : true, // check the login status upon init?
      cookie     : true, // set sessions cookies to allow your server to access the session?
      xfbml      : true  // parse XFBML tags on this page?
    });

    // Additional initialization code such as adding Event Listeners goes here
    FB.getLoginStatus(function(resp){
        if(resp.status === 'connected'){
            console.log("already login");
            getData();
            stat = resp.status;
            $("#facebookLogin").text("logout");
        }else if(resp.status === 'not_authorized'){
            console.log("noAuth");
        }else{
            console.log("noLogin");
        };
    });

    function getData(){
        FB.api("/me/", function(resp){
            console.log(resp);
        });
    }

    $("#facebookLogin").click(function(){
        console.log("click");
        if(stat === "connected"){
            console.log("connect");
            FB.logout(function(response) {
                $("#facebookLogin").text("login");
                stat = "";
            });
        }else{
            console.log("not connect");
            window.location = encodeURI("https://m.facebook.com/dialog/oauth?client_id="+appId+"&redirect_uri="+hostUrl+"&response_type=token&scope="+permission);
        }
    });

  };

  (function(d, debug){
     var js, id = 'facebook-jssdk', ref = d.getElementsByTagName('script')[0];
     if (d.getElementById(id)) {return;}
     js = d.createElement('script'); js.id = id; js.async = true;
     js.src = "//connect.facebook.net/ja_JP/all" + (debug ? "/debug" : "") + ".js";
     ref.parentNode.insertBefore(js, ref);
   }(document, false)); 



参考
JavaScript SDK

2013年1月21日月曜日

Google App EngineとPyScripterでハマった。

2013年はPythonの

僕自身は詳しくないのですが、巳年ということと、友人にPython使いが多いことから、Pythonを学び始めることにしました。
そしてGoogle App Engineを用いて開発しようとしたところで、躓きました。


文字コードに注意

エディターにPyScripterを用いて開発をしようとしたのですが、何故かGoogle App Engine Launcher内のプロジェクトが、赤文字になり、RunすることもLogsを見ることも何も選択できない状態になってしまいました。

この状態は、Google App Engine Launcherにプロジェクトを追加した後にフォルダを変更したり、app.yamlが読みこめていないときなどに起こるそうです。

日本語を利用したいのでPyScripterからファールフォーマットを、「Ansi」から「UTF-8」に変更したことが問題でした。

ここでは、「app.yaml」は、「UTF-8(No BOM)」を選択しなければなりません。

かといって、すべて「UTF-8(No BOM)」にすればいいかと言えばそうでもなく、.htmlなどは「UTF-8」を用います。




「PATHも通って、さっきまで動いていたのに何が問題なんだ!」



同じような事態になったときは、一度ご確認ください。