Android(Google Map)とPHPの連携
Google Mapの設定
- Google APIの有効化
- Google Maps Android APIの有効化
- 認証情報を追加して、APIキーを取得
- Android StudioでGoogle Maps Activityプロジェクトを作成してAPIキーを設定
プロジェクトの作成画面
認証情報を追加して、APIキーを取得
パッケージ名とフィンガープリントを追加するボタンを押して入力する。
パッケージ名はいつもの。フィンガープリントはコマンドを叩いて生成する。
cd /Users/ユーザー名/.android/ keytool -list -v -keystore debug.keystore -alias androiddebugkey -storepass android -keypass android
APIキーが取得できた!
次にAndroid StudioからGoogle Mapプロジェクトを選択する。
ちなみにここでビルドしてもAPIキーがないので、地図は表示されない。
先ほどのAPIキーは、google_maps_api.xmlに設定してやる。
<resources> <string name="google_maps_key" translatable="false" templateMergeStrategy="preserve"> AIzaSyC2elE...省略 </string> </resources>
これだけで、マークが1つあるシンプルな地図が表示された。
PHPとMYSQLを連携してデータベースに保存されているデータをJSONで吐き出す。
Androidのsqlite、PHPではMysqlつーのがある。このMysqlに接続して操作するためのユーティリティーライブラリがPDO。インストールは必要なくデフォルトで入っていた。もしかしたら、有効にしないと使えないのかもしれない。Mysqlに接続するためのDSN、ユーザー名、パスワード、テーブル、カラム名に関しては、人によって違う。レンタルサーバーの会社からメールで送られてくるので確認してみること。
テーブルのフィールド名
- id
- address
- shop
- lat
- 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) { } } } }