레이블이 구글맵 API 활용하기인 게시물을 표시합니다. 모든 게시물 표시
레이블이 구글맵 API 활용하기인 게시물을 표시합니다. 모든 게시물 표시

2010년 8월 2일 월요일

구글맵 API 활용하기 - (4) 위성 지도로 보이기

위성 지도 보이기

MapActivity에서 MapView 객체 가져오기

MapActivity 소스코드 내에서 findViewById 메서드를 이용하여 MapView객체의 레퍼런스를 찾아오기 위하여 android:id 속성을 추가한다.

변경할 파일은 <PROJECT>/res/layout/main.xml이다.

  1. <?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/testMapView"
            android:layout_width="fill_parent"
            android:layout_height="fill_parent"
            android:enabled="true"
            android:clickable="true"
            android:apiKey="03d0eYuU20SMHZARFYNbqBRkKERXqVPMMieAk8g"
            />

    </LinearLayout>

 

<PROJECT>/src/com.jjis.test/R.java 파일에 id와 관련된 속성이 inline class로 생성되었음을 알 수 있다.

그렇다면 생성된 ID를 이용해서 MapView 객체의 레퍼런스를 가져 오도록 findById 메서드를 이용해 보자. 아래와 같이 맴버 변수로 MapView 를 하나 선언하고 onCreate 메서드에 fiewViewById를 호출해서 mapView 변수에 할당하자. 여기서 View를 찾기위한 ID는 R.java의 R.id.testMapView를 이용할 수 있다.

 

  1. package com.jjis.test;

    import android.os.Bundle;

    import com.google.android.maps.MapActivity;
    import com.google.android.maps.MapView;

    public class MapTest extends MapActivity {
       
        private MapView mapView;
       
        /** Called when the activity is first created. */
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.main);
            mapView = (MapView)findViewById(R.id.testMapView);
        }

        @Override
        protected boolean isRouteDisplayed() {
            // TODO Auto-generated method stub
            return false;
        }

    }

 

MapView의 Satellite 속성 변경

이제 MapActivity에서 지도를 보여주던 MapView의 레퍼런스를 가져 왔으니 단순히 setSatellite 메서드를 이용해서 true속성만 전달해 주면 된다.

  1.     @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.main);
            mapView = (MapView)findViewById(R.id.testMapView);
  2.         mapView.setSatellite(true);
        }

 

이제 결과를 확인한다

 

 

출처 - http://zbum.springnote.com/pages/2658038

 

 

구글맵 API 활용하기 - (3) 지도에 확대/축소 기능 추가하기

강좌 작성환경
SDK Version : Android SDK 2.0, release 1
ADT Version : 0.9.4

추후 SDK업데이트로 인해 글의 내용과 최신 SDK 내용간 차이가 있을 수 있습니다.

* SDK 2.0 기준 업데이트 완료됨 : 2009/11/12

저번 강좌 이후로 공백이 좀 길었네요.
이래저래 제가 자유롭게(?) 글을 쓸 환경이 되질 않다보니 -_-... 이렇게 띄엄~띄엄 포스팅을 하게 되네요.
(물론 최근에 렌즈 구한다고 장터매복 했던 이유도 없지않게 있겠지만요, ㅎㅎ;;;)

긴 이야기는 이쯤에서 접어두고, 오늘은 저번에 예고했던 대로, 맵을 컨트롤하는 기능을 추가해보도록 하겠습니다.
맵을 컨트롤하려면, 깜찍이님 강좌에서처럼 할 수도 있지만, 저 방법은 제가 보는 책 (Professional Android Application Development)에 나와있는 방법인데다가, 제 실력이 딸려서인지는 몰라도 잘 이해가 가지 않아서, 메뉴 이용법 및 Toast 이용법까지 익힐 수 있도록 다른 방식으로 작성하는 법에 대해서 강좌를 진행하도록 하겠습니다.

일단, 메뉴를 이용해서 지도 확대/축소 버튼을 추가할 것입니다. 다음과 같이 말이죠.



사실, 메뉴 아이템(지도 확대, 축소 버튼)에 아이콘도 넣을 수 있지만, 이번 강좌에서는 사정상(...) 아이콘 넣는 것은 생략하고 지나가도록 하겠습니다.

일단, 메뉴부터 넣어보도록 하죠. 메뉴를 넣으려면 onCreateOptionsMenu()와 onOptionsItemSelected() 메소드를 오버라이드 해야 합니다. onCreateOptionsMenu()에서는 메뉴에 항목들을 추가해주고, onOptionsItemSelected()에서는 사용자가 실제로 메뉴 항목을 눌렀을 경우 처리할 작업을 입력해줍니다.

다음과 같이 onCreateOptionsMenu()메소드와 onOptionsItemSelected() 메소드를 추가합니다.
01.package com.androidhuman.HelloMaps;
02.  
03.import com.google.android.maps.MapActivity; // Activity가 아닌 MapActivity를 추가합니다.
04.  
05.import android.os.Bundle;
06.import android.view.Menu; // 메뉴를 사용하기 위해 import합니다.
07.import android.view.MenuItem; // 메뉴를 사용하기 위해 import 합니다.
08.  
09.public class HelloMaps extends MapActivity { // MapActivity를 상속합니다.
10.     /** Called when the activity is first created. */
11.    @Override
12.    public void onCreate(Bundle savedInstanceState) {
13.        super.onCreate(savedInstanceState);
14.        setContentView(R.layout.main);
15.                  
16.    }
17.          
18.  
19.@Override 
20.protected boolean isRouteDisplayed() { // MapActivity를 상속하면, 이 메소드를 추가해줘야 합니다.
21.    // TODO Auto-generated method stub
22.    return false;
23.}
24.public boolean onCreateOptionsMenu(Menu menu){
25.    super.onCreateOptionsMenu(menu);
26.    // 메뉴에 항목을 추가하려면 이 메소드에서 추가해줍니다.    
27.    return true;
28.}
29.  
30.public boolean onOptionsItemSelected(MenuItem item){
31.    super.onOptionsItemSelected(item);
32.          
33.    return true;
34.}
onCreateOptionsMenu() 메소드 오버라이드하고, 이를 수정함으로써 메뉴를 눌렀을 때 나오는 항목들을 변경할 수 있으며, onOptionsItemSelected() 메소드를 오버라이드하고 수저암으로써 메뉴의 각 항목을 눌렀을 때 나오는 항목들을 변경할 수 있습니다.

그럼, 먼저 메뉴 항목을 추가해볼까요??

아까 오버라이드한 onCreateOptionsMenu() 메소드를 다음과 같이 수정합니다.

1.public boolean onCreateOptionsMenu(Menu menu){
2.    super.onCreateOptionsMenu(menu);
3.    MenuItem zoomin = menu.add(0, 1, Menu.NONE, "지도 확대"); // 메뉴에 항목 추가
4.    MenuItem zoonout = menu.add(0, 2, Menu.NONE, "지도 축소"); // 메뉴에 항목 추가
5.      
6.    return true;
7.}

메뉴의 항목을 추가해주기 위해서는 add()메소드를 사용하면 됩니다.

public abstract MenuItem add (int groupId, int itemId, int order, CharSequence titleRes)
- groupid : 메뉴 항목의 그룹을 지정합니다.
- itemId : 각 메뉴 항목의 고유의 번호입니다.
- order : 각 항목의 정렬 방식입니다.
- titleRes : 메뉴 항목의 이름입니다.


위의 과정까지 추가하고 프로젝트를 실행한 후, 메뉴를 눌러보면 위 스크린샷과 같이 메뉴가 뜨는 것을 볼 수 있습니다. 하지만, 아직까지는 메뉴를 눌러도 아무런 동작을 하지 않을 것입니다. 메뉴 항목을 누름에 따라 어떻게 반응할지 지정해 주지 않았기 때문이죠.

그럼, 이제부터 메뉴 항목에 따라 어떤 동작을 할 지 지정해 주도록 하겠습니다.

그 전에, 우리가 하고싶은 일이 지도의 확대/축소, 즉 MapView를 컨트롤하는 일이므로 MapView의 컨트롤러를 받아와야 합니다. MapView의 컨트롤러는 MapView 객체를 받아온 후, getController() 메소드를 통해 받아올 수 있습니다.

우리는 여기에서 지도의 확대/축소를 구현하고, 확대/축소 레벨이 최대에 도달했을 경우 사용자에게 이를 알려주는 기능까지 구현해보도록 합시다. 지도를 확대/ 축소하는 등 지도를 '컨트롤' 하려면 MapView의 컨트롤러를 받아야 하는데, 이를 위해 MapView에 id를 지정해주어야 합니다. 그래야 findViewById()를 통해 MapView 객체를 받아올 수 있게 되겠죠. 다음과 같이 MapView의 ID를 지정해주도록 합니다.

1.<com.google.android.maps.MapView
2.    android:id="@+id/mapview"
3.    android:layout_width="fill_parent"
4.    android:layout_height="fill_parent"
5.        android:focusable="true" 
6.    android:clickable="true"
7.        android:apiKey="내 API KEY" />


MapView 객체과 그의 컨트롤러인 MapController를 사용하기 위해, 필요한 요소들을 import 하고 다음과 같이 코드를 수정합니다.

01.package com.androidhuman.HelloMaps;
02.  
03.import com.google.android.maps.MapActivity; // Activity가 아닌 MapActivity를 추가합니다.
04.import com.google.android.maps.MapController;
05.import com.google.android.maps.MapView;
06.  
07.import android.content.Context;
08.import android.os.Bundle;
09.import android.view.Menu;
10.import android.view.MenuItem;
11.import android.widget.Toast;
12.  
13.public class HelloMaps extends MapActivity { // MapActivity를 상속합니다.
14.    MapView v; // MapView를 연결해줄 객체를 생성합니다.
15.    /** Called when the activity is first created. */
16.    @Override
17.    public void onCreate(Bundle savedInstanceState) {
18.        super.onCreate(savedInstanceState);
19.        setContentView(R.layout.main);
20.        v = (MapView)findViewById(R.id.mapview);
21.          
22.    }
23.          
24.  
25.@Override 
26.protected boolean isRouteDisplayed() { // MapActivity를 상속하면, 이 메소드를 추가해줘야 합니다.
27.    // TODO Auto-generated method stub
28.    return false;
29.}
30.public boolean onCreateOptionsMenu(Menu menu){
31.    super.onCreateOptionsMenu(menu);
32.    MenuItem zoomin = menu.add(0, 1, Menu.NONE, "지도 확대");
33.    MenuItem zoomout = menu.add(0, 2, Menu.NONE, "지도 축소");
34.      
35.    return true;
36.}
37.  
38.public boolean onOptionsItemSelected(MenuItem item){
39.    super.onOptionsItemSelected(item);
40.    MapController control = v.getController(); // 맵 컨트롤러를 받아옵니다.
41.    Context context = getApplicationContext(); // Toast를 띄우기 위해 Context를 받아옵니다.
42.      
43.    switch(item.getItemId()){
44.    case 1: // 지도 확대
45.        if(!control.zoomIn()){
46.            Toast toast = Toast.makeText(context, "최대 줌 레벨에 도달했습니다.", Toast.LENGTH_SHORT);
47.            toast.show(); // Toast를 표시
48.            break;
49.        }
50.        break;
51.    case 2: // 지도 축소
52.        if(!control.zoomOut()){
53.            Toast toast = Toast.makeText(context, "최소 줌 레벨에 도달했습니다.", Toast.LENGTH_SHORT);
54.            toast.show(); // Toast를 표시
55.            break;
56.        }
57.          
58.          
59.    }
60.    return true;
61.}
62.  
63.}


메뉴 항목을 선택했을 때, 이를 처리해주는 onOptionsItemSelected()메소드를 보시면, switch구문에 getId()메소드로 각 메뉴 항목의 id를 가지고 처리하는 것을 볼 수 있습니다. 때문에, 메뉴 항목을 추가할 때 이 id가 겹치지 안도록 하는 것이 중요합니다.

지도의 확대/축소는 각각 MapController 객체의 zoomIn(), zoomOut() 메소드를 사용합니다. 이 메소드들은 지도를 확대/축소하는 기능 뿐만 아니라 만약 더이상 확대/축소가 가능하지 않다면 false를 반환합니다. 따라서, 이러한 특성을 이용하여 확대/축소가 최대 레벨에 도달하였을 대 사용자에게 이를 알려주도록 작성하였습니다.



코드를 보면, 사용자에게 최대 / 최소 줌 레벨 여부를 알려주는 수단으로 Toast를 이용하였습니다.
Toast는 간단한 메시지 등을 사용자에게 전달할 때 많이 사용하는데요, 마치 그 특성이 토스터기에서 나오는 빵처럼 '톡' 튀어나오는것과 비슷합니다. ^^;;;

Toast에 관한 내용은 다음 강좌에서 다루도록 하겠습니다. :)


출처 - http://androidhuman.tistory.com/
  

구글맵 API 활용하기 - (2) 구글맵 띄워보기

저번 시간에는 구글맵을 띄우기 위해 API Key를 발급받는 과정까지 알아보았습니다. 이번 시간부터는 본격적으로 구글맵을 띄워보는 것에 대해 다뤄보도록 하겠습니다.

[어플리케이션 정보]

액티비티
  • HelloMaps (HelloMaps.java)

레이아웃
  • main.xml

권한 (uses-permission)
  • android.permission.INTERNET
  • android.permission.ACCESS_FINE_LOCATION

외부 라이브러리 (uses-library)
  • com.google.android.maps

API Level
  • 6 : Google APis [Android 2.0.1]

어플리케이션 소스 :
구글맵은 인터넷을 통해 실시간으로 지도 데이터를 받게 되는데, 이를 위해 메니페스트 파일에 인터넷 사용 권한 (android.permission.INTERNET)을 추가해주어야 합니다. 이를 추가하지 않으면 지도 데이터를 받아올 수 없으므로 지도가 제데로 표시되지 않습니다. 그리고, 나중을 위해서(?) GPS의 위치 정보를 받을 수 있는 권한인 ACCESS_FINE_LOCATION도 추가해주도록 하였습니다.

구글맵을 띄우려면 Activity가 아닌 MapActivity를 상속해야 합니다. 따라서 프로젝트를 생성한 후, 아래와 같이 액티비티의 코드를 수정합니다.

package com.androidhuman.example.HelloMaps;

import com.google.android.maps.MapActivity; // Activity가 아닌 MapActivity를 추가합니다.
import android.os.Bundle;

public class HelloMaps extends MapActivity { // MapActivity를 상속합니다.
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
    }

@Override 
protected boolean isRouteDisplayed() { // MapActivity를 상속하면, 이 메소드를 추가해줘야 합니다.
	// TODO Auto-generated method stub
	return false;
}
}



설정이 끝났다면, 레이아웃에 MapView를 추가해주는 일이 남았는데요, 그 전에 권한 설정 및 라이브러리 사용 설정을 변경해주어야 합니다. AndroidManifest.xml 파일을 열어보도록 합시다.

이클립스에서 열어본 Androidmanifest,xml 파일



일단, 권한(Permission)설정을 추가해주도록 합시다. 아래 탭에서 Permission 탭을 클릭합니다.
인터넷 사용 권한과 위치정보를 받을 수 있는 권한을 추가해보도록 합시다.

Add.. 버튼을 눌러 다음 창을 띄웁니다. 여기서 Uses Permission을 클릭해줍니다.


OK를 클릭한 후, 아래와 같이 위치정보를 이용하는 권한을 추가해주고, 같은 방법으로 인터넷을 이용하는 권한까지 추가해주도록 합시다.





그 다음은, 구글맵을 사용하기 위해 라이브러리를 이용하도록 해주는 과정을 수행합니다. Application 탭을 클릭한 후,Application Nodes의 Add.. 버튼을 누른 후, Uses Library를 선택합니다.



OK를 누른 후, 아래와 같이 사용할 라이브러리를 선택해줍니다.



다 추가하였다면, main.xml을 다음과 같이 수정합니다.


<?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:layout_width="fill_parent"
	android:layout_height="fill_parent"
        android:clickable="true"
	android:apiKey="자신의 API KEY" />
</LinearLayout>



위의 코드에서, apiKey (API Key)가 가장 중요합니다. apiKey에 이전 강좌 (2009/03/16 - [안드로이드/안드로이드 입문] - #06. 구글맵 API 활용하기 - (1) MD5 Fingerprint 생성, API Key 발급받기)에서 발급받았던 API Key를 입력해야만 지도가 제데로 보이게 됩니다. 잘못된 키를 입력한다면, 지도가 제데로 뜨지 않고 회색 타일(?) 만 뜨게 되니, 주의하세요!

위에 첨부한 소스 파일을 그대로 테스트해보시려는 분들은 소스 파일에 입력되으 있는 API Key를 그대로 사용하시면 지도가 제데로 뜨지 않으니 필히 자신이 발급받은 API Key로 수정한 후 사용하셔야 합니다.

API Key를 수정하였다면, MapView 속성 중 Clickable을 true로 설정하여 맵을 클릭할 수 있도록 해줍니다. 지도롤 이동하려면 지도를 클릭한 후 움직여주어야 하니, 이 옵션은 필수입니다. :)

모두 추가해주었다면, 한번 실행해 볼까요?  다음과 같이 나온다면 성공한 것입니다!



어때요? 생각보다 어렵지는 않죠? :)
다음 시간에는 지도를 확대/축소하는 것에 대해서 알아보도록 하겠습니다.


출처 - http://androidhuman.tistory.com/

구글맵 API 활용하기 - (1) MD5 Fingerprint 생성, API Key 발급받기

지금까지 써왔던 것들은 모두 안드로이드 기본 패키지에 들어가있던 것들로, 별도의 라이브러리 설정이 필요가 없었습니다. 하지만, 구글맵의 경우 추가로 구글에서 제공하는 API를 사용하는 것이기에 타겟도 구글맵 라이브러리가 포함된 타겟을 사용해야 하고, 메니페스트 파일에 추가로 선언도 해 주어야 합니다. 그 전에, 구글맵 API를 제데로 사용하려면 우선 "인증"의 과정이 필요합니다.

구글맵 API가 오픈되어있지만, 결국 사용자들이 API를 통해 정보를 요구하면 구글맵 서버로부터 정보를 받아오게 됩니다. 그러다보니 아무나 마구 API를 사용할 수 있게 한다면 서버에 과부하가 일어날 가능성이 높겠죠?? 그래서 구글에서는 API를 사용하려는 사람에게 API Key를 발급해주고, 그 키를 가진 사람만이 지도 정보를 받아올 수 있도록 하고 있습니다.

구글맵을 사용하기 위해서 필요한 API Key를 발급받기 위해서는 일종의 "개발자 인증"이라고도 할 수 있는 keystore를 이용하여 MD5 Fingerprint를 생성한 후, 생성된 Fingerprint를 가지고 API 키를 발급받아야 합니다. 이 keystore는 나중에 어플리케이션을 개발하여 마켓에 등록하기 전 어플케이션 서명을 할 때 꼭 필요한 것으로, 여기에서는 테스트에 사용되는 debug keystore를 사용하지만 실제로 마켓에 올리거나 단말기에 어플리케이션을 올릴 때에는 자신의 keystore를 사용하여야 합니다.

그럼, 본격적으로 MD5 Fingerprint를 얻는 방법에 대해서 알아보겠습니다. 
MD5 Fingerprint를 얻기 위해서는 keytool이라는 툴을 이용하여야 하는데, 이 keytool은 안드로이드 SDK 내에 있는 것이 아니라 [JDK가 설치된 폴더]/bin 폴더 내에 있습니다.



keytool을 이용하려면 명령 프롬프트를 이용하여야 하는데, 이때 JDK의 Path가 설정되어 있지 않으면 매우 불편합니다. JDK의 Path가 등록되어 있는 경우도 있지만, 등록되어 있지 않을 경우 수동으로 등록해주도록 합시다. 내 컴퓨터 - 속성을 선택한 후, 고급 탭의 [환경 변수] 버튼을 누르면 아래와 같은 화면이 표시됩니다.


여기에서, 아래의 시스템 변수 목록 중 Path 항목을 선택한 후, 편집을 눌러 아래와 같이 맨 마지막 항목 각 항목을 구분지어주는 문자인 세미콜론(;)을 입력한 후, JDK의 bin 폴더의 경로를 입력한 후, 확인을 눌러주시면 됩니다.


Path가 제데로 등록 되었다면, 본격적으로 MD5 Fingerprint를 생성할 차례입니다.
안드로이드 어플리케이션 테스트에 사용되느 디버그용 keystore는 윈도우 XP 기준으로 C:\Documents and Settings\[사용자 계정명]\.android 폴더 내에 debug.keystore라는 이름으로 저장되어있습니다.


여기에서 아래와 같이 입력합니다.

keytool -list -alias androiddebugkey -keystore debug.keystore -storepass android -keypass android



잠시 기다리면 아래와 같이 생성된 MD5 Fingerprint가 표시됩니다.


 잘 복사하시고, 이것을 http://code.google.com/android/maps-api-signup.html 에 가신 후, MD5 Fingerprint를 입력하고, 구글 계정으로 로그인하면 API Key가 발급됩니다.

동의 찍고 Generate API Key 누르고~~


생성된 MD5 Fingerprint를 입력한 후, Generate API Key 버튼을 누르시면 아래와 같이 사용자 키가 발급됩니다.
이 사용자 키는 잃어버리지 않게 유의하셔야 합니다. 앞으로 동일한 개발환경에서는 이 API Key를 사용하여 구글맵 API를 사용할 수 있으며, 만약 개발환경이 바뀐 경우에는 다시 API Key를 발급받아야 정상적으로 구글맵 API를 사용할 수 있습니다.


이로써 구글맵 API를 이용하기 위한 준비 절차가 모두 끝났습니다.
다음시간부터는 본격적으로 어플리케이션에서 구글맵을 이용하는 방법에 대해 알아보도록 하겠습니다 :)


출처 - http://androidhuman.tistory.com/