さまよえる、Android

Androidのプログラミングで便利なことや残しておきたいことを残しておく。もしオススメのライブラリがあったら教えてくださいね。

Android(Google Map)とPHPの連携

Google Mapの設定

AndroidGoogle Mapを利用する手順

  1. Google APIの有効化
  2. Google Maps Android APIの有効化
  3. 認証情報を追加して、APIキーを取得
  4. Android StudioGoogle Maps Activityプロジェクトを作成してAPIキーを設定

プロジェクトの作成画面

f:id:araiyusukej:20151112113450p:plain

Google APIの有効化

f:id:araiyusukej:20151112113621p:plain

Google Maps Android APIの有効化

f:id:araiyusukej:20151112114722p:plain

f:id:araiyusukej:20151112114958p:plain

認証情報を追加して、APIキーを取得

f:id:araiyusukej:20151112113648p:plain

f:id:araiyusukej:20151112114739p:plain

f:id:araiyusukej:20151112114753p:plain

パッケージ名とフィンガープリントを追加するボタンを押して入力する。

f:id:araiyusukej:20151112115206p:plain

パッケージ名はいつもの。フィンガープリントはコマンドを叩いて生成する。

cd /Users/ユーザー名/.android/

keytool -list -v -keystore debug.keystore -alias androiddebugkey -storepass android -keypass android

f:id:araiyusukej:20151112115251p:plain

APIキーが取得できた!

f:id:araiyusukej:20151112115316p:plain

次にAndroid StudioからGoogle Mapプロジェクトを選択する。

ちなみにここでビルドしてもAPIキーがないので、地図は表示されない。

先ほどのAPIキーは、google_maps_api.xmlに設定してやる。

<resources>
    <string name="google_maps_key" translatable="false" templateMergeStrategy="preserve">
            AIzaSyC2elE...省略
    </string>
</resources>

これだけで、マークが1つあるシンプルな地図が表示された。

PHPMYSQLを連携してデータベースに保存されているデータをJSONで吐き出す。

AndroidsqlitePHPではMysqlつーのがある。このMysqlに接続して操作するためのユーティリティーライブラリがPDO。インストールは必要なくデフォルトで入っていた。もしかしたら、有効にしないと使えないのかもしれない。Mysqlに接続するためのDSN、ユーザー名、パスワード、テーブル、カラム名に関しては、人によって違う。レンタルサーバーの会社からメールで送られてくるので確認してみること。

テーブルのフィールド名
  1. id
  2. address
  3. shop
  4. lat
  5. lng
<?php
error_reporting(E_ALL & ~E_NOTICE);
define('DSN','MYSQLのDSN');
define('DB_USER','ユーザー名');
define('DB_PASSWORD','パスワード');
try {
	$db = new PDO(DSN, DB_USER, DB_PASSWORD);
	$sth = $db->prepare("select * from テーブル名");
	$sth->execute();
	$userData = array();
	while($row = $sth->fetch(PDO::FETCH_ASSOC)){
    		$userData[]=array(
    			'id'=>$row['id'],
    			'address'=>$row['address'],
    			'shop'=>$row['shop'],
			'lat' => $row['lat'],
			'lng' => $row['lng']
    		);
	}
	header('Content-type: application/json;');
	echo json_encode($userData);

} catch (PDOException $e) {
    echo $e->getMessage();
    exit;
}

適当にテーブルに値を保存して、ブラウザーからphpのファイルにアクセスするとJSON形式でデータが表示される。

[{"id":"1","address":"\u6c96\u7e04\u770c\u90a3\u8987\u5e02\u7267\u5fd7\u30003-3-1\u3000","shop":"\u5e02\u5834\u306e\u53e4\u672c\u5c4b\u3000\u30a6\u30e9\u30e9","lat":"26.214549","lng":"127.688672"},{"id":"2","address":"\u718a\u672c\u770c\u718a\u672c\u5e02\u897f\u533a\u4e8c\u672c\u6728\u30004-22-4\u3000\t","shop":"\u9b41\u5b54\u820e","lat":"32.77912","lng":"130.690389"}]

JSONをダウンロードして、GoogleMapにマークを表示する。

volleyというネットワーク系のライブラリをインストールする。

    compile 'com.mcxiaoke.volley:library:1.0.7'

MainActivity.java

import android.os.Bundle;
import android.support.v4.app.FragmentActivity;
import android.widget.Toast;

import com.android.volley.RequestQueue;
import com.android.volley.Response;
import com.android.volley.VolleyError;
import com.android.volley.toolbox.JsonArrayRequest;
import com.android.volley.toolbox.Volley;
import com.google.android.gms.maps.CameraUpdate;
import com.google.android.gms.maps.CameraUpdateFactory;
import com.google.android.gms.maps.GoogleMap;
import com.google.android.gms.maps.SupportMapFragment;
import com.google.android.gms.maps.model.LatLng;
import com.google.android.gms.maps.model.MarkerOptions;

import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

public class MapsActivity extends FragmentActivity {

    private GoogleMap mMap;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_maps);
        setUpMapIfNeeded();
        String uri = "http://sports-sensor.com/book/index.php";
        RequestQueue mRequestQueue = Volley.newRequestQueue(getApplicationContext());
        JsonArrayRequest request = new JsonArrayRequest(
                uri,
                new Response.Listener<JSONArray>(){
                    LatLng location;
                    @Override
                    public void onResponse(JSONArray response) {
                        int count = response.length();
                        for(int i = 0; i < count; i++){
                            try {
                                JSONObject jo = response.getJSONObject(i);
                                Double lat = Double.parseDouble(jo.getString("lat"));
                                Double lng = Double.parseDouble(jo.getString("lng"));

                                location = new LatLng(lat,lng);
                                MarkerOptions options = new MarkerOptions();
                                options.position(location);
                                options.title(jo.getString("shop"));
                                options.snippet(jo.getString("shop"));
                                mMap.addMarker(options);

                            } catch (JSONException e) {
                                // TODO Auto-generated catch block
                                e.printStackTrace();
                            }
                        }
                        CameraUpdate cu = CameraUpdateFactory.newLatLng(location);
                        mMap.moveCamera(cu);
                        Toast.makeText(getApplicationContext(), response.toString(), Toast.LENGTH_LONG).show();

                    }
                },
                new Response.ErrorListener() {
                    @Override
                    public void onErrorResponse(VolleyError error) {
                        Toast.makeText(getApplicationContext(), "onErrorResponse", Toast.LENGTH_LONG).show();
                    }
                }
        );
        Object TAG_REQUEST_QUEUE = new Object();
        request.setTag(TAG_REQUEST_QUEUE);
        mRequestQueue.add(request);
        mRequestQueue.start();
    }

    @Override
    protected void onResume() {
        super.onResume();
        setUpMapIfNeeded();
    }

    private void setUpMapIfNeeded() {
        if (mMap == null) {
            mMap = ((SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.map))
                    .getMap();
            if (mMap != null) {
            }
        }
    }
}