Androidアプリでgoogle画像検索する話


qnote Advent Calendar 2015 22日目を担当いたします。
11の倍数日担当のチャン・ジュン(日本人)です。
よろしくどうぞ

今回は画像検索して何かしたいな〜という話です。

画像を検索する

とりあえず画像検索をするということで、画像検索APIの利用を考えたのですが思いのほか不便そうです。
検索範囲とか絞られちゃうと思い通りの検索結果は得られないですし…

そこで思いついたのが、
「普通にGoogle画像検索を利用すれば良いんじゃないの?」です。

Google検索のパラメータ(URLパラメータ)一覧を参考にしました。

http://www.google.co.jp/search?

の後ろに

tbm= isch

とつければ画像検索になります。
キーワードは

q=keyword

「+」接続で条件追加「-」接続で除外ができます。

他にも検索オプションがあるので必要に応じて使用してください。

画像のURLを取得する

上記のURLを利用して検索結果を取得するとhtmlファイルが手に入るのでimgタグに入った画像のURLを取得します。
下記は取得したhtmlファイルから画像のURLを抽出する部分です

final String regex = "<img.+?src=\"(.+?)\".+?>";
Pattern pattern = Pattern.compile(regex);
Matcher matcher = pattern.matcher(response);

ArrayList<String> imageUrlList = new ArrayList<>();
while (matcher.find()){
    imageUrlList.add(matcher.group(1));
}

検索結果取得に関する通信系の処理については割愛します。

画像を表示する

今回はノープランなので、取得した画像のURLを使ってGridViewで表示だけしてみます。

下記はGridViewにセットしたアダプターの一部です。
ここではVolleyのNetworkImageViewを利用しています。

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    if (convertView == null){
        convertView = new NetworkImageView(mContext);
        ViewGroup.LayoutParams layoutParams = new ViewGroup.LayoutParams(200, 200);
        convertView.setLayoutParams(layoutParams);
        ((NetworkImageView)convertView).setScaleType(ImageView.ScaleType.FIT_CENTER);
        ((NetworkImageView)convertView).setDefaultImageResId(R.mipmap.ic_launcher);
    }
    ((NetworkImageView)convertView).setImageUrl(getItem(position), mImageLoader);
    return convertView;
}

だがしかし20件しか取得できない!

limit/offset的ななにか

参考にしたサイトに記載された「num」オプションはlimitのようなものかなと思ったのですが、

num=0  … 効く

num=100 … 効かない

ということで仕方ないので検索してみました。

分散検索:Google vs Solr

こちらの記事によると

start=10 … offset的なもの

ということで、取得件数は変えられなかったので画像のURLを取得してArrayListに入れた後、
必要数に達していない場合は再度リクエストを投げることにしました。

表示したい画像数が多い場合には、スクロール等をトリガーに追加取得とかの方が良いかもしれません。

最後に

画像の著作権には注意しましょう!