2012年4月5日 星期四

[TQC+ Android] 3-6 查詢地圖 Use MapView , Google Map API 2.0





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







沒有留言:

張貼留言

Google Analytics