FoursquareAPIをandroidで @WHT

先週の三連休は初めてのハッカソンに参加してきました!

つくばの女の子エンジニア(の卵)が集まるWomen’s Hackathon at Tsukubaです。

 

私が所属していたグループはひょんなことから、同じコンセプトのアプリをWeb版とandroid版でつくることになりました。

(ハッカソンの話はそれはそれで別に書こうと思います。)

 

そんな中androidアプリでFoursquareAPIを使ったら大変なことになった話をします。

この件に関しては、ほんとメンターさまさまです。あの方が居らっしゃらなければ、完全にandroidアプリは捨てていました。

 

FoursquareAPIとは

Foursquareは場所にチェックインすることができるアプリ”でした”。

最近はSwarmにチェックイン機能が移動して、Foursquareは飲食店検索アプリに特化することになったみたいです。不便。 ただ、そのお店の情報(= Tips)なんかも見れて、お得情報とか役に立つことがあります。

このFoursquareのAPIを使うと、特にデベロッパーIDを取得しなくても、飲食店(アプリではvenueとよんでいるので、以下ベニューと表記しますね)が取得できることです。

もちろんGPSによる緯度経度情報があれば、近くのお店も検索できるわけです。

今回のアプリは、一言で言えば、自分の近くの飲食店を検索できるアプリだったので、このAPIを使用することにしました。

androidのためのFoursquareAPIライブラリ

Foursquareのデベロッパーのためのページを見ると…

easyFoursquare4Android (Android)

とかいう表記があります。えーこれを使わないわけないじゃないですかー

Javaがほぼ初めてのお相手だったもので、android用に用意されてるものなら、楽かなー 程度に使い始めました!

が!

どこにもリファレンスが落ちていないためコードを読み解き、eclipseの予測変換を頼りになんとかしていくこととなりました。(主にメンターさんがなんとかしてくれました)

githubのeasyFoursquare4AndroidExample中のファイルについていじっていきます。

近くの建物を取得する

とりあえずまず最初にMainActivity.javaのonAccessGrant関数のcheckin関数をコメントアウトしましょう。自分のアカウントで知らない場所に勝手にチェックインされます。

チェックインしちゃってる関数がこれ

    private void checkin() {

        CheckInCriteria criteria = new CheckInCriteria();
        criteria.setBroadcast(CheckInCriteria.BroadCastType.PUBLIC);
        criteria.setVenueId("4c7063da9c6d6dcb9798d27a"); //このIDで指定されたベニューに勝手にチェックインされる

        async.checkIn(new CheckInListener() {
            @Override
            public void onCheckInDone(Checkin checkin) {
                Toast.makeText(MainActivity.this, checkin.getId(), Toast.LENGTH_LONG).show();
            }

            @Override
            public void onError(String errorMsg) {
                Toast.makeText(MainActivity.this, "error", Toast.LENGTH_LONG).show();
            }
        }, criteria);
    }

MainActivity.javaを見るとrequestTipsNearby関数があります。

    private void requestTipsNearby() {
        Location loc = new Location(""); //緯度軽度を入れとくLocationクラスのオブジェクトを作成
        loc.setLatitude(40.4363483); //緯度を指定
        loc.setLongitude(-3.6815703); //経度を指定

        TipsCriteria criteria = new TipsCriteria(); //検索するパラメータを入れとくTipsCriteriaクラスのオブジェクト
        criteria.setLocation(loc); //緯度経度パラメータを指定

        async.getTipsNearby(new TipsRequestListener() {

            @Override
            public void onError(String errorMsg) {
                Toast.makeText(MainActivity.this, "error", Toast.LENGTH_LONG).show();
            }
            @Override
            public void onTipsFetched(ArrayList<Tip> tips) {
                // Tipsが得られたら、Toastで表示
                Toast.makeText(MainActivity.this, tips.toString(), Toast.LENGTH_LONG).show();
            }
        }, criteria);
    }

 

位置座標を指定すると、近くのTipsをとってきてくれる関数です。これを元に、requestVenuesNearby関数をつくります。

コードは以下。
これをこのまま使うためには、画面上にidが”venue”のTextViewを作っておく必要があります。

   private void requestVenuesNearby(String categoryID){
        Location loc = null;
        //locに最後に取得した緯度経度の情報をいれる。
        loc = locationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER);

        VenuesCriteria criteria = new VenuesCriteria(); //検索するパラメーターを(ry

        criteria.setLocation(loc); //緯度経度を指定
        criteria.setQuantity(10); //取得する件数を指定

        async.getVenuesNearby(new FoursquareVenuesRequestListener() {

			@Override
			public void onError(String errorMsg) {
				// TODO Auto-generated method stub
                Toast.makeText(MainActivity.this, "error", Toast.LENGTH_LONG).show();

			}

			@Override
			public void onVenuesFetched(ArrayList<Venue> venues) {
                                // TODO Auto-generated method stub

				TextView text = (TextView)findViewById(R.id.venue);
				String str = "";
				for(Venue v: venues){
					str += v.getName() + "\n";
				}
				text.setText(str);

			}
		}, criteria);

    }

説明はコメントのとおり。

これでGPSで取得した位置の近くの建物が10件取得できましたー

カテゴリー指定をして検索する

アプリの目的は近くの”飲食店”を検索することです。なんですが、最初のままだとカテゴリの指定ができません。

.setCategory()とかいうメソッドがありそうでありません。なかったのでつくらないとまずそうです。

easyFoursquare4Androidをgithubからクローンすると、MainActivityというフォルダ(Exampleコードがあるフォルダ)と、もう一つ「easyFoursquare4Android」というフォルダがあります。このフォルダ内のソースファイルをいじります。

easyFoursquare4Android > src > br.com.condesales.tasks.venues >FoursquareVenuesNearbyRequest.java

このFoursquareVenuesNearbyRequest.javaを変更すれば、いろいろ検索条件を変えて便利にすることができそうっす(・∀・)
この60行目あたり。

   protected ArrayList<Venue> doInBackground(String... params) {

        String access_token = params[0];
        ArrayList<Venue> venues = new ArrayList<Venue>();

        try {

            //date required
            String apiDateVersion = FoursquareConstants.API_DATE_VERSION;
            // Call Foursquare to get the Venues around
            String uri = "https://api.foursquare.com/v2/venues/search"
                    + "?v="
                    + apiDateVersion
                    + "&ll="
                    + mCriteria.getLocation().getLatitude()
                    + ","
                    + mCriteria.getLocation().getLongitude()
                    + "&llAcc="
                    + mCriteria.getLocation().getAccuracy()
                    + "&query="
                    + mCriteria.getQuery()
                    + "&limit="
                    + mCriteria.getQuantity()
                    + "&intent="
                    + mCriteria.getIntent().getValue()
                    + "&radius="
                    + mCriteria.getRadius()

          //ここにカテゴリ用のIDを追加する。
            	    + "&categoryId="
            	    + mCriteria.getCategory();
            if (!access_token.equals("")) {
                uri = uri + "&oauth_token=" + access_token;
            } else {
                uri = uri + "&client_id=" + FoursquareConstants.CLIENT_ID + "&client_secret=" + FoursquareConstants.CLIENT_SECRET;
            }

 (略)
       return venues;
    }

次は、MainActivityで、setCategory関数が使えるように

easyFoursquare4Android > src > br.com.condesales.tasks.criterias >VenuesCriteria.java

を編集します。(ファイル名統一されててほんとわかりやすい)

いろいろな変数を宣言しているあたりで、


	private String mCategory = "";

を追加して、set◯◯関数やget◯◯関数を宣言しているあたりで


	public String getCategory(){
		return mCategory;
	}

	public void setCategory(String mCategory){
		this.mCategory = mCategory;
	}

この二つを追加。

これで、最初に編集した、requestVenuesNearby関数に

criteria.setcategory("4bf58dd8d48988d1c4941735")

を追加したら完成です。

引数には飲食店のカテゴリID(4bf58dd8d48988d1c4941735)をわたしてるので、
そこを変更したりラジオボタンで選択できるようにすると、任意のカテゴリを指定できて便利。

まとめ

FoursquareAPIをAndroid開発用に使いやすくしてくれる素晴らしいライブラリでした。

Exampleを動かしていると勝手がわかってきて、Javaに慣れている人なら、自由自在に使うことができるのではないでしょうか(・∀・)!

私はわからず人に聞きまくってしまいましたが…

CLIENTIDを指定することもできるので、その他のユーザー情報を利用することもできるかと思います。

ブログに書くためにいろいろ省略したのでうまく動くかちょっと心配です(・´з`・)

githubリンクはこっちら

Share on Facebook
このエントリーをはてなブックマークに追加
Pocket

最近更新された記事