設計查詢地圖 , 可輸入想查詢的經緯度 , 於輸入後點選查詢 , 可顯示欲查詢地圖並可放大縮小地圖 , 這題的重點是在申請 Android Maps API Key , 過程是先從開發環境得電腦中取得Keystore 的MD5編碼 , 再透過Google網站簽暑便可取得了 , 另外因為必須使用到Google API 所以在建立Android 專案時 , Build target 記得選擇有Google API。
以下是取得Android Maps API Key的步驟:
1. 至開發環境 Eclipse IDE 中
Window > Preferences > Android > Build > Default debug keystore 取得 keystore的存放路徑
2. 進入Dos模式 . 將目錄切換至JAVA資料夾下的\jre\bin, 範例路徑: C:\Java\jdk1.6.0\17\jre\bin
(視電腦安裝路徑而定) , 然後在目錄下輸入以下指令 , 取得MD5編碼。
keytool -list -alias androiddebugkey -keystore "第一步驟的keystore的存放路徑" -storepass android -keypass android
3. 指令執行成功之後 , 會產生 keystore 檔案 , 並可取得一組MD5編碼 , 然後至以下網址輸入MD5編碼 , 取得Android Maps API Key。
https://code.google.com/intl/zh-TW/android/maps-api-signup.html
圖片中最下面那段xml配置範例是之後要加入到MapView的android:apiKey屬性值中的。
接下來我們來看看程式碼的部分。
package COM.TQC.GDD03; import android.app.AlertDialog; import android.content.DialogInterface; import android.os.Bundle; import android.view.View; import android.widget.Button; import android.widget.EditText; import com.google.android.maps.GeoPoint; import com.google.android.maps.MapActivity; import com.google.android.maps.MapController; import com.google.android.maps.MapView; public class GDD03 extends MapActivity { private MapController MapController; private MapView MapView; private Button btn_query, btn_zoomIn, btn_zoomOut; private EditText EditLongitude; //經度 private EditText EditLatitude; //緯度 private int intZoomLevel=0; private double dLng=121.228626;//預設經度 private double dLat=25.0402226; //預設緯度 @Override protected void onCreate(Bundle icicle) { super.onCreate(icicle); setContentView(R.layout.main); EditLongitude = (EditText) this.findViewById(R.id.editText1); EditLongitude.setText(dLng+""); EditLatitude = (EditText) this.findViewById(R.id.editText2); EditLatitude.setText(dLat+""); intZoomLevel = 15; MapView = (MapView) findViewById(R.id.mapview); //MapView.setBuiltInZoomControls(false); //參數為True時 , 使用者可以直接控制MapView的縮放大小 //在這邊使用false讓使用者使用我們的按鈕來控制MapView的縮放大小 MapView.setStreetView(true); //顯示街道圖 MapController = MapView.getController(); refreshMapView(); btn_query = (Button)findViewById(R.id.btn_query); btn_query.setOnClickListener(new Button.OnClickListener() { //@Override public void onClick(View v) { if(EditLongitude.getText().toString().equals("")|| EditLatitude.getText().toString().equals("")) { showDialog("經度或緯度填寫不正確!"); } else { showDialog("顯示地圖"); refreshMapView(); } } }); btn_zoomIn = (Button)findViewById(R.id.btn_zoomIn); btn_zoomIn.setOnClickListener(new Button.OnClickListener() { //@Override public void onClick(View v) { intZoomLevel++; MapController.setZoom(intZoomLevel); } }); btn_zoomOut = (Button)findViewById(R.id.btn_zoomOut); btn_zoomOut.setOnClickListener(new Button.OnClickListener() { //@Override public void onClick(View v) { intZoomLevel--; MapController.setZoom(intZoomLevel); } }); } GeoPoint GPoint; public void refreshMapView() { dLng = Double.parseDouble(EditLongitude.getText().toString()); dLat = Double.parseDouble(EditLatitude.getText().toString()); GPoint = new GeoPoint((int)(dLat*1E6),(int)(dLng*1E6)); //GeoPoint GPoint = new GeoPoint(19240000,-99120000); MapController.setCenter(GPoint); //將MapView的中心點定位在GPoint的位置 MapController.setZoom(intZoomLevel); //設定地圖縮放比例 MapView.invalidate(); } @Override protected boolean isRouteDisplayed() { return false; //為了計算目的的需要 , 要讓Server知道我們是否正在顯示相關的路由資訊 //在這個應用中是用不到 , 所以我們回傳false } private void showDialog(String mess) { new AlertDialog.Builder(GDD03.this).setTitle("Message") .setMessage(mess) .setNegativeButton("確定", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int which) {} }) .show(); } }
由於MapActivity class 不在Android 官方內建的API中 , 我們必須在AndroidManifest.xml中引入 library : com.google.android.maps , 另外我們會存取使用者的當前座標所以還必須註冊相關的 use-permission 。
再來看看layout檔案
先前提到MapActivity class 不是Android 官方的API , 所以在官方的開發函式文件中是找不到相關資料的 , 下面這個網站可取得相關的資料。
Google Map APIs
P.S. 題目中所要求的Variable和Method皆會保留 , 也會根據題目所要求的流程去實作 , 縱使題目要求繞遠路....
沒有留言:
張貼留言