Flickr APIを使ってみよう(2.写真を検索する)


Flickr APIを使ってみよう(1.APIキーの取得)ではFlickr APIを使用するために必要なAPIキーを取得しました。

今回はこのAPIキーを使用してFlickr上の写真を検索してみましょう。
本来ならばFlickrの醍醐味である写真を取得するということをまず行いたいと思いますが、
写真を取得するためには今回紹介する検索にて表示する写真の情報をまず取得しなければならないため、
写真の取得より前に検索を紹介致します。

詳細は以下から。

まず初めに

今回紹介するAPIはFlickrが提供するWeb APIになります。
Web APIとは一般にHttpリクエストでサーバーに処理のリクエストを行い、結果をjsonやXMLなどのデータフォーマットで取得するものになります。
本記事内で使用されるAPIという言葉はAndroid標準のAPIではなくWeb APIを指します。

なぜ検索が必要なのか?

検索の紹介の前になぜこの検索という行為が必要なのかを解説します。

写真を取得するためにPhoto Source URLsというものが用意されています。
Photo Source URLsは以下の組み合わせで構成されるURLになります。

http://farm{farm-id}.staticflickr.com/{server-id}/{id}_{secret}.jpg

上記URLを構成するためのfarm-idserver-ididsecretは写真によって異なり、これらの構成情報を取得するための手段として検索を行うことになります。

flickr.photos.search APIを使用して検索を行う

検索を行うためのAPIとして、flickr.photos.searchが用意されています。

このAPIはREST APIですので、AndroidではHttpResponseクラス、HttpUriRequestクラス、HttpClientクラスを使用してHTTP通信を行うことで使用する事ができます。(HTTP通信の詳細はこちらを参照してください。)

flickr APIでは検索結果をjsonとxmlの形式で取得することができます。

本記事ではjsonとして検索結果を取得します。

下記は任意の文字列でタグとフリーテキスト検索を行うサンプルです。

private String getPhotoData(String appkey, String keyword){
    HttpClient client = new DefaultHttpClient();
    HttpParams params = client.getParams();
    HttpConnectionParams.setConnectionTimeout(params, 10000);
    HttpConnectionParams.setSoTimeout(params, 10000);

    // Uri作成
    URI uri = null;
    try {
        uri = new URI(
                "http://api.flickr.com/services/rest/?method=flickr.photos.search&api_key="
                        + appkey + "&text" + keyword + "&tags=" + keyword + "&format=json&nojsoncallback=1");
    } catch (URISyntaxException e) {
        Log.e(TAG, e.toString());
    }
    // 通信開始
    HttpUriRequest httpRequest = new HttpGet(uri);

    HttpResponse httpResponse = null;
    try {
        httpResponse = client.execute(httpRequest);
    } catch (ClientProtocolException e) {
        Log.e(TAG, "httpRequest:" + e.toString());
    } catch (IOException e) {
        Log.e(TAG, "httpRequest:" + e.toString());
    }

    if (httpResponse == null) {
        return "";
    }

    // jsonの取得
    String json = "";

    if (httpResponse != null
            && httpResponse.getStatusLine().getStatusCode() == HttpStatus.SC_OK) {
        HttpEntity httpEntity = httpResponse.getEntity();
        try {
            json = EntityUtils.toString(httpEntity);
        } catch (ParseException e) {
            Log.e(TAG, "EntityUtils:" + e.toString());
        } catch (IOException e) {
            Log.e(TAG, "EntityUtils:" + e.toString());
        }
    }

    return json;
}

10、11、12行目で検索を行うためのリクエスト用URLを作成しています。
flickr.photos.search APIのURL構成は下記のようになっています。

http://api.flickr.com/services/rest/?method=flickr.photos.search&api_key=[APIキー]
    &[オプション名]=[オプションの値]&format=json&nojsoncallback=1

上記の黒文字部分は固定値で赤文字部分は変動値となります。

APIキーには前回取得したKeyを指定してください。

オプションは様々なものがありますが、今回はtagtextを使用しています。
tagオプションは写真に付与されているタグに対して検索を行う場合に使用します。

textオプションは写真に関連付けられているタグ以外の全ての文字列情報に対して検索を行う場合に使用します。

オプションは&を使用することで何個でも指定することが可能です。
使用できるオプションはこちらを参考にしてください。
指定するオプションによって検索結果が変動しますので、アプリによって適切なオプションを指定して検索精度を向上させましょう。
こちらのページでAPIのテストを行えますのでこのページを使用して適切なオプションを導き出してください。

APIの最後に指定しているformat=json&nojsoncallback=1は検索結果をjsonで取得するためのオプションになります。
xmlで取得したい場合はformat=restと指定してください。

次回は返却されるjsonの構成と解析方法、画像の取得方法を紹介します。

One Comment