Ilmu yang banyak saya
pelajari sendiri, saya temukan di google, saya praktekkan dan menjadi
pengalaman tersendiri. Kalau sudah begini, saya berpikir, untuk apa
sebenarnya kita kuliah? Yaw memang saya sadari di dunia perkuliahan kita
tidak mendapat ilmu-ilmu tersebut. Justru yang kita dapatkan di dunia
perkuliahan adalah ilmu sosial, ilmu untuk berkomunikasi dengan orang
lain, ilmu untuk mencari relasi.
Selain itu saya juga mendapatkan pengalaman baru tentang pahitnya
kenyataan hidup yang saya temui belakangan ini. Saya menjadi semakin
sadar kenapa kita harus mandiri, kenapa kita harus mampu berdiri
sendiri, kenapa kita tidak boleh bergantung pada orang lain. Pesan yang
selalu disampaikan oleh ibu saya dulu kepada saya. Ketika kita
bergantung pada orang lain, dan orang lain itu pergi maka habislah sudah
kita.
Pengalaman kehidupan lainnya yang saya temui ialah tak ada gunanya
hanya bisa protes, mengkritik, menyindir tanpa memberikan solusi untuk
hal tersebut. Kalau cuma bisa protes, nyindir, mengkritik, bocah SMA
juga bisa kayak gitu. Gak perlu menempuh pendidikan yang tinggi hanya
untuk berperilaku seperti itu. Untuk apa??? Apa hanya agar terlihat
idealis?? Terlihat inTelek??? Ahh,,sudahlah, kalau memang dari bibit
sudah seperti, mau gimana lagi :D. Dan yang terakhir, yang benar-benar
mengena di hati adalah ketika saya dianggap pengkhianat. Walau tidak
secara langsung, tapi yaw sudah terlihat jelas. Kadang saya berkata di
dalam hati, “Wahai guruku, jika kau salah dan menyesal memberikan ilmumu
kepadaku, aku siap menjalani karma dan jalan hidupku sebagai seorang
Karna.”
Ahhh, udah dulu sesi curhatnya :D. Di postingan kali ini saya akan
membahas tentang google maps di android. Kebetulan kemarin ada yang
bertanya tentang bagaimana menampilkan titik-titik koordinat yang
sumbernya dari database. Dulu saya pernah membuat seperti ini, saat
masih menggunakan google maps versi yang terdahulu. Dan implementasi di
google maps yang terbaru ini agak berbeda. OK deh, kita langsung aja ke
pembahasannya.
1. Silahkan buat project baru yang mengimplementasikan library google map, tutorialnya ada
disini.
2. Buat sebuah class baru untuk file koneksi,
Koneksi.java.
1 | package dlmbg.pckg.petabesakih; |
5 | public String isi_koneksi() |
7 | //isi sendiri dengan alamat ip/domain |
3. Output data yang saya ambil, formatnya berupa JSON. Jadi disini
saya menggunakan class JSONParser untuk melakukan parsing datanya.
1 | package dlmbg.pckg.petabesakih; |
3 | import java.io.BufferedReader; |
4 | import java.io.IOException; |
5 | import java.io.InputStream; |
6 | import java.io.InputStreamReader; |
7 | import java.io.UnsupportedEncodingException; |
10 | import org.apache.http.HttpEntity; |
11 | import org.apache.http.HttpResponse; |
12 | import org.apache.http.NameValuePair; |
13 | import org.apache.http.client.ClientProtocolException; |
14 | import org.apache.http.client.entity.UrlEncodedFormEntity; |
15 | import org.apache.http.client.methods.HttpGet; |
16 | import org.apache.http.client.methods.HttpPost; |
17 | import org.apache.http.client.utils.URLEncodedUtils; |
18 | import org.apache.http.impl.client.DefaultHttpClient; |
19 | import org.json.JSONException; |
20 | import org.json.JSONObject; |
22 | import android.util.Log; |
24 | public class JSONParser { |
26 | static InputStream is = null; |
27 | static JSONObject jObj = null; |
28 | static String json = ""; |
34 | public JSONObject makeHttpRequest(String url, String method, |
40 | DefaultHttpClient httpClient = new DefaultHttpClient(); |
41 | HttpPost httpPost = new HttpPost(url); |
42 | httpPost.setEntity(new UrlEncodedFormEntity(params)); |
44 | HttpResponse httpResponse = httpClient.execute(httpPost); |
45 | HttpEntity httpEntity = httpResponse.getEntity(); |
46 | is = httpEntity.getContent(); |
48 | }else if(method == "GET"){ |
49 | DefaultHttpClient httpClient = new DefaultHttpClient(); |
50 | String paramString = URLEncodedUtils.format(params, "utf-8"); |
51 | url += "?" + paramString; |
52 | HttpGet httpGet = new HttpGet(url); |
54 | HttpResponse httpResponse = httpClient.execute(httpGet); |
55 | HttpEntity httpEntity = httpResponse.getEntity(); |
56 | is = httpEntity.getContent(); |
59 | } catch (UnsupportedEncodingException e) { |
61 | } catch (ClientProtocolException e) { |
63 | } catch (IOException e) { |
68 | BufferedReader reader = new BufferedReader(new InputStreamReader( |
69 | is, "iso-8859-1"), 8); |
70 | StringBuilder sb = new StringBuilder(); |
72 | while ((line = reader.readLine()) != null) { |
73 | sb.append(line + "\n"); |
77 | } catch (Exception e) { |
78 | Log.e("Buffer Error", "Error converting result " + e.toString()); |
82 | jObj = new JSONObject(json); |
83 | } catch (JSONException e) { |
84 | Log.e("JSON Parser", "Error parsing data " + e.toString()); |
90 | public JSONObject AmbilJson(String url) { |
93 | DefaultHttpClient httpClient = new DefaultHttpClient(); |
94 | HttpPost httpPost = new HttpPost(url); |
96 | HttpResponse httpResponse = httpClient.execute(httpPost); |
97 | HttpEntity httpEntity = httpResponse.getEntity(); |
98 | is = httpEntity.getContent(); |
100 | } catch (UnsupportedEncodingException e) { |
102 | } catch (ClientProtocolException e) { |
104 | } catch (IOException e) { |
109 | BufferedReader reader = new BufferedReader(new InputStreamReader( |
110 | is, "iso-8859-1"), 8); |
111 | StringBuilder sb = new StringBuilder(); |
113 | while ((line = reader.readLine()) != null) { |
114 | sb.append(line + "\n"); |
117 | json = sb.toString(); |
118 | } catch (Exception e) { |
119 | Log.e("Buffer Error", "Error converting result " + e.toString()); |
123 | jObj = new JSONObject(json); |
124 | } catch (JSONException e) { |
125 | Log.e("JSON Parser", "Error parsing data " + e.toString()); |
4. Selanjutnya buka file MainActivity.java. Class MainActivity
mengimplementasikan abstract class OnMapLongClickListener. Copy kode di
bawah ini, lumayan banyak :p
1 | package dlmbg.pckg.petabesakih; |
3 | import java.util.ArrayList; |
4 | import java.util.HashMap; |
6 | import org.json.JSONArray; |
7 | import org.json.JSONException; |
8 | import org.json.JSONObject; |
10 | import android.app.Activity; |
11 | import android.app.FragmentManager; |
12 | import android.app.ProgressDialog; |
13 | import android.content.Intent; |
14 | import android.os.AsyncTask; |
15 | import android.os.Bundle; |
16 | import android.view.View; |
17 | import android.widget.TextView; |
19 | import com.google.android.gms.common.ConnectionResult; |
20 | import com.google.android.gms.common.GooglePlayServicesUtil; |
21 | import com.google.android.gms.maps.CameraUpdateFactory; |
22 | import com.google.android.gms.maps.GoogleMap; |
23 | import com.google.android.gms.maps.GoogleMap.InfoWindowAdapter; |
24 | import com.google.android.gms.maps.GoogleMap.OnInfoWindowClickListener; |
25 | import com.google.android.gms.maps.GoogleMap.OnMapLongClickListener; |
26 | import com.google.android.gms.maps.MapFragment; |
27 | import com.google.android.gms.maps.model.LatLng; |
28 | import com.google.android.gms.maps.model.Marker; |
29 | import com.google.android.gms.maps.model.MarkerOptions; |
31 | public class MainActivity extends Activity implements OnMapLongClickListener, OnInfoWindowClickListener{ |
33 | static final LatLng AWAL = new LatLng(3.584695,98.675079); |
34 | ArrayList> dataMap = new ArrayList>(); |
35 | private ProgressDialog pDialog; |
36 | JSONParser jParser = new JSONParser(); |
37 | Koneksi lo_Koneksi = new Koneksi(); |
38 | String isi = lo_Koneksi.isi_koneksi(); |
39 | String link_url = isi + "peta.php"; |
40 | JSONArray str_json = null; |
42 | class MyInfoWindowAdapter implements InfoWindowAdapter{ |
44 | private final View myContentsView; |
46 | MyInfoWindowAdapter(){ |
47 | myContentsView = getLayoutInflater().inflate(R.layout.custom_info_contents, null); |
51 | public View getInfoContents(Marker marker) { |
52 | TextView tvTitle = ((TextView)myContentsView.findViewById(R.id.title)); |
53 | tvTitle.setText(marker.getTitle()); |
54 | TextView tvSnippet = ((TextView)myContentsView.findViewById(R.id.snippet)); |
55 | tvSnippet.setText(marker.getSnippet()); |
57 | return myContentsView; |
61 | public View getInfoWindow(Marker marker) { |
67 | class getListInfo extends AsyncTask { |
69 | protected void onPreExecute() { |
71 | pDialog = new ProgressDialog(MainActivity.this); |
72 | pDialog.setMessage("Menghubungkan ke server..."); |
73 | pDialog.setIndeterminate(false); |
74 | pDialog.setCancelable(true); |
78 | protected String doInBackground(String... args) { |
80 | JSONObject json = jParser.AmbilJson(link_url); |
83 | str_json = json.getJSONArray("info"); |
85 | for(int i = 0; i < str_json.length(); i++) |
87 | JSONObject ar = str_json.getJSONObject(i); |
88 | HashMap map = new HashMap(); |
90 | map.put("judul", ar.getString("judul")); |
91 | map.put("koordinat_lang", ar.getString("koordinat_lang")); |
92 | map.put("koordinat_lat", ar.getString("koordinat_lat")); |
93 | map.put("keterangan", ar.getString("keterangan")); |
97 | } catch (JSONException e) { |
104 | protected void onPostExecute(String file_url) { |
106 | runOnUiThread(new Runnable() { |
109 | for (int i = 0; i < dataMap.size(); i++) |
111 | HashMap map = new HashMap(); |
112 | map = dataMap.get(i); |
113 | LatLng POSISI = new LatLng(Double.parseDouble(map.get("koordinat_lat")),Double.parseDouble(map.get("koordinat_lang"))); |
115 | myMap.addMarker(new MarkerOptions() |
117 | .title(map.get("judul")) |
118 | .snippet(map.get("keterangan"))); |
127 | final int RQS_GooglePlayServices = 1; |
128 | private GoogleMap myMap; |
132 | protected void onCreate(Bundle savedInstanceState) { |
133 | super.onCreate(savedInstanceState); |
134 | setContentView(R.layout.peta_online); |
136 | FragmentManager myFragmentManager = getFragmentManager(); |
137 | MapFragment myMapFragment |
138 | = (MapFragment)myFragmentManager.findFragmentById(R.id.map); |
139 | myMap = myMapFragment.getMap(); |
141 | myMap.setMyLocationEnabled(true); |
143 | myMap.setMapType(GoogleMap.MAP_TYPE_TERRAIN); |
145 | myMap.getUiSettings().setZoomControlsEnabled(true); |
146 | myMap.getUiSettings().setCompassEnabled(true); |
147 | myMap.getUiSettings().setMyLocationButtonEnabled(true); |
149 | myMap.getUiSettings().setAllGesturesEnabled(true); |
151 | myMap.setTrafficEnabled(true); |
153 | myMap.setOnMapLongClickListener(this); |
154 | myMap.setInfoWindowAdapter(new MyInfoWindowAdapter()); |
155 | myMap.setOnInfoWindowClickListener(this); |
157 | myMap.moveCamera(CameraUpdateFactory.newLatLngZoom(AWAL, 15)); |
159 | myMap.animateCamera(CameraUpdateFactory.zoomTo(10), 2000, null); |
161 | new getListInfo().execute(); |
166 | protected void onResume() { |
169 | int resultCode = GooglePlayServicesUtil.isGooglePlayServicesAvailable(getApplicationContext()); |
171 | if (resultCode != ConnectionResult.SUCCESS) |
173 | GooglePlayServicesUtil.getErrorDialog(resultCode, this, RQS_GooglePlayServices); |
178 | public void onMapLongClick(LatLng point) { |
183 | public void onInfoWindowClick(Marker marker) { |
184 | Intent intent = new Intent(this, DetailPeta.class); |
186 | String replace_string_first = marker.getTitle().replace(" ", "_"); |
187 | intent.putExtra("judul", replace_string_first); |
188 | startActivity(intent); |
5. Ketika marker muncul di peta dan kemudian di-tap, maka akan muncul
keterangannya. Dan ketika keterangannya di-tap, maka akan muncul
keterangan selengkapnya beserta gambarnya.
1 | package dlmbg.pckg.petabesakih; |
3 | import java.io.BufferedInputStream; |
4 | import java.io.IOException; |
5 | import java.io.InputStream; |
7 | import java.net.URLConnection; |
8 | import java.util.ArrayList; |
9 | import java.util.HashMap; |
11 | import org.json.JSONArray; |
12 | import org.json.JSONException; |
13 | import org.json.JSONObject; |
15 | import android.app.Activity; |
16 | import android.app.ProgressDialog; |
17 | import android.graphics.Bitmap; |
18 | import android.graphics.BitmapFactory; |
19 | import android.os.AsyncTask; |
20 | import android.os.Bundle; |
21 | import android.util.Log; |
22 | import android.widget.ImageView; |
23 | import android.widget.TextView; |
25 | public class DetailPeta extends Activity { |
27 | ArrayList> dataMap = new ArrayList>(); |
28 | private ProgressDialog pDialog; |
29 | JSONParser jParser = new JSONParser(); |
31 | JSONArray str_json = null; |
32 | Koneksi lo_Koneksi = new Koneksi(); |
33 | String isi = lo_Koneksi.isi_koneksi(); |
35 | TextView judul_set, keterangan_set; |
38 | protected void onCreate(Bundle savedInstanceState) { |
39 | super.onCreate(savedInstanceState); |
40 | setContentView(R.layout.detail_peta); |
42 | keterangan_set = (TextView) findViewById(R.id.keterangan); |
43 | judul_set = (TextView) findViewById(R.id.judul); |
44 | gambar_set = (ImageView) findViewById(R.id.gambar); |
46 | Bundle b = getIntent().getExtras(); |
47 | String judul = b.getString("judul"); |
49 | link_url = isi + "detail.php?judul="+judul; |
50 | new getListInfo().execute(); |
53 | class getListInfo extends AsyncTask { |
55 | protected void onPreExecute() { |
57 | pDialog = new ProgressDialog(DetailPeta.this); |
58 | pDialog.setMessage("Menghubungkan ke server..."); |
59 | pDialog.setIndeterminate(false); |
60 | pDialog.setCancelable(true); |
64 | protected String doInBackground(String... args) { |
66 | JSONObject json = jParser.AmbilJson(link_url); |
69 | str_json = json.getJSONArray("info"); |
71 | for(int i = 0; i < str_json.length(); i++) |
73 | JSONObject ar = str_json.getJSONObject(i); |
74 | HashMap map = new HashMap(); |
76 | map.put("judul", ar.getString("judul")); |
77 | map.put("koordinat_lang", ar.getString("koordinat_lang")); |
78 | map.put("koordinat_lat", ar.getString("koordinat_lat")); |
79 | map.put("keterangan", ar.getString("keterangan")); |
80 | map.put("gambar", ar.getString("gambar")); |
84 | } catch (JSONException e) { |
91 | protected void onPostExecute(String file_url) { |
93 | runOnUiThread(new Runnable() { |
96 | for (int i = 0; i < dataMap.size(); i++) |
98 | HashMap map = new HashMap(); |
100 | judul_set.setText(map.get("judul")); |
101 | keterangan_set.setText(map.get("keterangan")); |
103 | new DownloadImagesTask().execute(isi+"gambar/"+map.get("gambar")); |
110 | public class DownloadImagesTask extends AsyncTask { |
113 | protected Bitmap doInBackground(String... urls) { |
114 | return download_Image(urls[0]); |
118 | protected void onPostExecute(Bitmap result) { |
119 | gambar_set.setImageBitmap(result); |
122 | private Bitmap download_Image(String url) { |
125 | URL aURL = new URL(url); |
126 | URLConnection conn = aURL.openConnection(); |
128 | InputStream is = conn.getInputStream(); |
129 | BufferedInputStream bis = new BufferedInputStream(is); |
130 | bm = BitmapFactory.decodeStream(bis); |
133 | } catch (IOException e) { |
134 | Log.e("Hub","Error getting the image from server : " + e.getMessage().toString()); |
6. Selanjutnya kita buat 3 file layout xml untuk aplikasi peta sederhana ini :
peta_online.xml
2 | http://schemas.android.com/apk/res/android |
"
3 | android:layout_width="match_parent" |
4 | android:layout_height="match_parent" |
5 | android:orientation="vertical"> |
9 | android:layout_width="match_parent" |
10 | android:layout_height="match_parent" |
11 | class="com.google.android.gms.maps.MapFragment"/> |
detail_peta.xml
2 | http://schemas.android.com/apk/res/android |
"
3 | android:layout_width="match_parent" |
4 | android:layout_height="match_parent" |
5 | android:orientation="vertical" |
6 | android:padding="10dp" > |
9 | android:layout_width="fill_parent" |
10 | android:layout_height="wrap_content" |
13 | android:layout_height="wrap_content" android:layout_width="fill_parent" |
14 | android:orientation="vertical" > |
17 | android:layout_height="wrap_content" |
18 | android:id="@+id/judul" |
19 | android:textSize="20sp" |
20 | android:textColor="#000" |
21 | android:layout_width="fill_parent" > |
25 | android:layout_height="200dp" |
26 | android:id="@+id/gambar" |
27 | android:layout_width="fill_parent" > |
31 | android:layout_height="wrap_content" |
32 | android:id="@+id/keterangan" |
33 | android:textSize="14sp" |
34 | android:textColor="#000" |
35 | android:layout_width="fill_parent" > |
custom_info_contents.xml
2 | http://schemas.android.com/apk/res/android |
"
3 | android:layout_width="wrap_content" |
4 | android:layout_height="wrap_content" |
5 | android:orientation="horizontal"> |
8 | android:layout_width="wrap_content" |
9 | android:layout_height="wrap_content" |
10 | android:orientation="vertical"> |
12 | android:id="@+id/title" |
13 | android:layout_width="wrap_content" |
14 | android:layout_height="wrap_content" |
15 | android:textSize="12dp" |
16 | android:textStyle="bold"/> |
18 | android:id="@+id/snippet" |
19 | android:layout_width="wrap_content" |
20 | android:layout_height="wrap_content" |
21 | android:textSize="10dp"/> |
7. Sekarang kita beralih ke pembuatan database dan tabelnya, saya buat tabel yang sederhana saja.
1 | CREATE TABLE `dlmbg_sitemap` ( |
2 | `nomor` int(5) NOT NULL auto_increment, |
3 | `nama` varchar(100) NOT NULL, |
4 | `jenis` varchar(100) NOT NULL, |
5 | `deskripsi` tinytext NOT NULL, |
9 | ) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ; |
8. Sekarang kita memanfaatkan PHP untuk mengambil data dari database MySQL. Disini saya menggunakan koneksi PDO.
koneksi.php
4 | $DBH = new PDO("mysql:host=localhost;dbname=srikmcom_peta", "srikmcom_lumbung", "lumbung32"); |
5 | $DBH->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); |
7 | } catch (PDOException $e) { |
8 | echo "Terjadi error.."; |
peta.php
2 | include("koneksi.php"); |
4 | $kueri = "SELECT judul, SUBSTRING(keterangan,1,200) as keterangan, koordinat_lang, koordinat_lat FROM dlmbg_sitemap"; |
5 | $STH = $DBH->prepare($kueri); |
8 | while($data = $STH->fetch()) |
13 | echo '{"info":'. json_encode($arr).'}'; |
9. Langsung coba ke dalam emulator atau debug langsung ke hape android, dan hasilnya seperti di bawah ini :
Hehe, lumayan panjang juga yaw. Menurut saya lebih mudah menampilkan
koordinat di google maps V2 ini. Karena sudah banyak class-class yang
disediakan dan siap diimplementasikan. OK deh, sekian dulu postingan
saya kali ini.