[[ワーキンググループ/勉強会]]

* Google Mapを表示してみよう [#nda8313a]

Google Mapを表示するMapActivityと、現在位置を取得するAPIを用いて、アプリケーションのベースを作成します。

以下、作成のポイントです。
- Google Mapを表示するビューは、com.google.android.maps.MapViewです
-- 別ライブラリーなので、マニフェストにuses-libraryでcom.google.android.mapsの指定が必要です
-- インターネットにアクセスするので、マニフェストにuses-permissionでandroid.permission.INTERNETの宣言が必要です
-- Google Mapにアクセスするためにandroid:apiKeyの指定が必要です。エミュレータでは、任意の文字列("myapikey"など)で動作します。

- Mapを制御するアクティビティは、com.google.android.maps.MapActivityです。
-- isRouteDisplayedを実装する必要があります。ルート情報を表示する場合はtrueを返します。

- Mapのズームや表示位置の設定などは、MapControllerを取り出して行います。

** 手順1: 新規のプロジェクトを作成する [#u71c58d3]

- "File -> New -> Project"を選択して、開いたダイアログで"Android Poroject"を選択して、"Next"ボタンを押します。
- 開いたダイアログで、以下のように入力してFinishボタンを押します。
-- Project Name: hellomap
-- Package name: jp.hews.hellomap
-- Activity Name: HelloMapActivity
-- Application Name: ハローマップ
#ref(map.001.NewProject.jpg)

** 手順2: マニフェストファイルを設定する [#hbf9ed07]

- このアプリケーションは、インターネットにアクセスするので、manifestの子要素に、以下のパーミッションの使用を宣言する
 <uses-permission android:name="android.permission.INTERNET"/>
- このアプリケーションは、MapViewを使用するので、applicationの子要素に、以下のライブラリの使用を宣言する
 <uses-library android:name="com.google.android.maps"/>
- 上記の二つを追加したマニフェストファイルの全体は、以下のようになります。
 <?xml version="1.0" encoding="utf-8"?>
 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
       package="jp.hews.hellomap"
       android:versionCode="1"
       android:versionName="1.0.0">
     <application android:icon="@drawable/icon" android:label="@string/app_name">
         <activity android:name=".HelloMapActivity"
                   android:label="@string/app_name">
             <intent-filter>
                 <action android:name="android.intent.action.MAIN" />
                 <category android:name="android.intent.category.LAUNCHER" />
             </intent-filter>
         </activity>
	 <!-- 以下のuses-libraryを追加 -->
         <uses-library android:name="com.google.android.maps"/>
     </application>
     <!-- 以下のuses-permissionを追加 -->
     <uses-permission android:name="android.permission.INTERNET"/>
 </manifest> 
  

** 手順3: レイアウトを決定する [#u0ce8235]

 画面のレイアウトを決定しましょう。このアプリケーションでは、上部に水平方向のリニアレイアウトを配置し、中に地図を表示するMapViewを配置します。

- レイアウトのリソースを作成します。res/layoutのmain.xmlを開き、以下のように入力します。実機で動作させる場合には、apiKeyの取得が必要ですが、エミュレータで動作させる場合には、任意の文字列で動作します。
 <?xml version="1.0" encoding="utf-8"?>
 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
     android:orientation="vertical"
     android:layout_width="fill_parent"
     android:layout_height="fill_parent"
     >
 <com.google.android.maps.MapView
         android:id="@+id/mapview"
         android:layout_width="fill_parent" 
         android:layout_height="fill_parent"
         android:enabled="true"
         android:clickable="true"
         android:apiKey="apisamples"
         />	
 </LinearLayout>
 

** 手順4: MapActivityを継承する [#f58bb354]

配置したMapViewの処理を呼び出すために、アクティビティのベースクラスをMapActivityに変更します。

- srcの下のjp.hews.hellomapのHelloMapActivity.javaを開いて、Activityを継承している部分を、MapActivityの継承に書き換えますMapActivityをインポートするために、ctrl-shift-Oを押します。
 public class HelloMapActivity extends MapActivity {

- 抽象メソッドのisRouteDisplayedを実装します。エラーの小さな赤いバツをクリックして、"add unimplemented methods"を選択するか、Sourceメニューの"Override/Implement methods"を選択すると便利です。戻り値は、felaseにします。
      @Override
      protected boolean isRouteDisplayed() {
          return false;
      }
 
- プロジェクトを右クリックして、"Run As"->"Android Application"で実行してみましょう。MapActivityの初期値に設定されている地図が表示されます。
#ref(map.002.DefaultMapActivity.png)

** 手順5: Mapを拡大して表示する [#ibb21f83]

このままでは、地図が大きすぎるので、拡大して表示してみましょう。ここでは、簡略化のため、固定の倍率と場所を設定してみましょう。

- onCreateメソッドの中で、findViewByIdを使用してMapViewクラスを取り出します。MapViewをctrl-shift-Oでインポートします。
        MapView m = (MapView)findViewById(R.id.mapview);
- MapViewからMapControllerを取り出します。ズームレベルと、表示する場所をを設定します。
        MapController c = m.getController(); 
- コントローラを使用してズームレベルと、表示する場所を設定します。
        c.setZoom(15);
        c.setCenter(new GeoPoint(35455281,139629711));
- この時点で、ソースコードは、以下のようになっています。
 package jp.hews.hellomap;
  
 import android.os.Bundle;
  
 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 HelloMapActivity extends MapActivity {
  
  	/** Called when the activity is first created. */
      @Override
      public void onCreate(Bundle savedInstanceState) {
          super.onCreate(savedInstanceState);
          setContentView(R.layout.main);
          
          MapView m = (MapView)findViewById(R.id.mapview);
          MapController c = m.getController();
          c.setZoom(15);
          c.setCenter(new GeoPoint(35455281,139629711));
      }
  
      @Override
      protected boolean isRouteDisplayed() {
          return false;
      }
  }
- 実行すると、以下の画面が表示されます。
#ref(map.003.MapActivity.png)

----
[[ワーキンググループ/勉強会]]