設計查詢地圖 , 可輸入想查詢的經緯度 , 於輸入後點選查詢 , 可顯示欲查詢地圖並可放大縮小地圖 , 這題的重點是在申請 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皆會保留 , 也會根據題目所要求的流程去實作 , 縱使題目要求繞遠路....

沒有留言:
張貼留言