태터데스크 관리자

도움말
닫기
적용하기   첫페이지 만들기

태터데스크 메시지

저장하였습니다.

Google Maps Android API v2 사용하기 (ICS 이하 단말기 지원하기 : SupportMapFragment)

2013.01.13 21:35

안드로이드용 구글맵이 업데이트되면서, 조금 더 유연한 레이아웃 배치 지원을 위해 기존의 MapView+MapActivity의 조합 대신 프래그먼트(MapFragment) 형태로 사용하도록 변경되었습니다. (기존의 MapView를 바로 사용할 수도 있지만, 액티비티/프래그먼트의 생애주기 메서드와 연동 작업이 필요하므로 가급적 MapFragment를 사용하는 것을 권장합니다)


그런데, 프래그먼트가 안드로이드 3.0부터 등장한 클래스이기에 안드로이드 2.3(진저브레드) 이하 단말기에서는 이를 사용할 수 없습니다. 때문에 구글에서는 안드로이드 3.0 미만 단말기에서도 프래그먼트를 사용할 수 있도록 별도의 라이브러리를 제공하고 있고, 구글맵에서도 이를 지원하기 때문에 안드로이드 2.3 이하 단말기에서도 새로운 구글맵을 사용할 수 있습니다.


프로젝트 준비하기


안드로이드용 구글맵 V2를 사용하기 위한 기본 준비가 필요합니다. (권한 설정, API Key 등록 등)

자세한 방법은 다음 포스트를 참조하세요.




SupportMapFragment 사용을 위한 준비


SupportMapFragment는 안드로이드 2.3 이하 단말기에서 사용할 수 있는 프래그먼트 클래스(android.support.v4.app.Fragment - Support library v4에 포함되어 있음)를 사용합니다. 따라서 기존에 Support library에 있는 프래그먼트를 사용하는 방식과 동일하게 사용하면 됩니다.


먼저, Support library를 사용하기 위해 프로젝트 속성(Properties) > Java Build Path > Libraries > Add JARs... 버튼을 클릭합니다. 다음과 같이 JAR Selection 창이 표시되는데, 여기에서 프로젝트 폴더 내의 /libs/android-support-v4.jar를 선택합니다.




다음과 같이 Support library가 등록됩니다.



레이아웃 및 액티비티 작성


이제 액티비티에 표시할 레이아웃을 다음과 같이 작성합니다. class에 com.google.android.gms.maps.MapFragment 대신 com.google.android.gms.maps.SupportMapFragment를 넣어주면 됩니다.


<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity" >

     <fragment
        android:id="@+id/map"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        class="com.google.android.gms.maps.SupportMapFragment" />

</RelativeLayout>


다음, 액티비티를 작성합니다. 프래그먼트를 사용할 수 있도록 Activity 대신 FragmentActivity를 상속하고, getFragmentManager() 대신 getSupportFragmentManager()를 사용하여 FragmentManager의 인스턴스를 받아 프래그먼트를 찾도록 합니다.


package com.androidhuman.example.mapsv2support;

import android.os.Bundle;
import android.support.v4.app.FragmentActivity;
import android.view.Menu;

import com.google.android.gms.maps.GoogleMap;
import com.google.android.gms.maps.SupportMapFragment;

public class MainActivity extends FragmentActivity {
	
	GoogleMap mGoogleMap;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		
		mGoogleMap = ((SupportMapFragment)getSupportFragmentManager()
						.findFragmentById(R.id.map)).getMap();
	}

	@Override
	public boolean onCreateOptionsMenu(Menu menu) {
		// Inflate the menu; this adds items to the action bar if it is present.
		getMenuInflater().inflate(R.menu.activity_main, menu);
		return true;
	}

}

모든 작업이 끝났습니다. 프로젝트를 실행하면 다음과 같이 지도가 잘 표시되는 것을 확인할 수 있습니다.




포스트에서 사용한 예제 프로젝트를 아래에 첨부하였습니다. 참고하실 분은 참고하세요~~


예제 프로젝트
Github : https://github.com/kunny/blog_samples/tree/master/Android/2013-01-13_Google_Maps_V2_Support

Download :   Mapsv2Support.zip




저작자 표시 비영리 변경 금지
신고

커니 위치 기반 서비스 사용하기/구글 지도 (Google Maps) , , , , , , , , , , , ,

  1. 제가 구글 api맵키에 패키지명.maps2support 이렇게 추가하고 커니님의 소스를 임폴트하고
    실행을 해서 get google play service 누르면요 Sorry! 하면서 앱이 죽는데요 로그캣에러를 보니

    01-24 23:06:28.751: E/AndroidRuntime(420): FATAL EXCEPTION: main
    01-24 23:06:28.751: E/AndroidRuntime(420): android.content.ActivityNotFoundException: No Activity found to handle Intent { act=android.intent.action.VIEW dat=http://play.google.com/store/apps/details?id=com.google.android.gms flg=0x80000 pkg=com.android.vending }
    01-24 23:06:28.751: E/AndroidRuntime(420): at android.app.Instrumentation.checkStartActivityResult(Instrumentation.java:1408)
    01-24 23:06:28.751: E/AndroidRuntime(420): at android.app.Instrumentation.execStartActivity(Instrumentation.java:1378)
    01-24 23:06:28.751: E/AndroidRuntime(420): at android.app.Activity.startActivityForResult(Activity.java:2817)
    01-24 23:06:28.751: E/AndroidRuntime(420): at android.support.v4.app.FragmentActivity.startActivityForResult(FragmentActivity.java:817)
    01-24 23:06:28.751: E/AndroidRuntime(420): at android.app.Activity.startActivity(Activity.java:2923)
    01-24 23:06:28.751: E/AndroidRuntime(420): at com.google.android.gms.internal.d$2.onClick(Unknown Source)
    01-24 23:06:28.751: E/AndroidRuntime(420): at android.view.View.performClick(View.java:2408)
    01-24 23:06:28.751: E/AndroidRuntime(420): at android.view.View$PerformClick.run(View.java:8816)
    01-24 23:06:28.751: E/AndroidRuntime(420): at android.os.Handler.handleCallback(Handler.java:587)
    01-24 23:06:28.751: E/AndroidRuntime(420): at android.os.Handler.dispatchMessage(Handler.java:92)
    01-24 23:06:28.751: E/AndroidRuntime(420): at android.os.Looper.loop(Looper.java:123)
    01-24 23:06:28.751: E/AndroidRuntime(420): at android.app.ActivityThread.main(ActivityThread.java:4627)
    01-24 23:06:28.751: E/AndroidRuntime(420): at java.lang.reflect.Method.invokeNative(Native Method)
    01-24 23:06:28.751: E/AndroidRuntime(420): at java.lang.reflect.Method.invoke(Method.java:521)
    01-24 23:06:28.751: E/AndroidRuntime(420): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
    01-24 23:06:28.751: E/AndroidRuntime(420): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
    01-24 23:06:28.751: E/AndroidRuntime(420): at dalvik.system.NativeStart.main(Native Method)

    이렇게 떠요 문제가 어떤거죠 몇시간헤매도 모르겟어요

  2. Blog Icon
    앱이죽어요

    제가 문제해결해볼려고요 저 파일 임폴트후 패키지명 끝을요 mapsv2example이라고 바꾸고요
    실행을하고 get google play service누르면요 이번엔 에러없이 갑자기 종료되네요..

  3. 에뮬레이터에서는 실행이 불가능합니다~

  4. Blog Icon

    비밀댓글입니다

  5. 이클립스는 Indigo(3.7) 버전 이상을 쓰시는 걸 권장합니다.
    다른 IDE는 저도 안해봐서 잘 모르겠네요~

  6. Blog Icon
    아이고

    안녕하세요. 혹시, 오른쪽 아래의 Zoomcontrol 의 위치를 변경할 수 있는 방법이 있나요? 아래쪽에 다른 뷰를 올려야 하는데 자꾸 Zoomcontrol 이 가려지네요 ㅠㅠ

  7. Blog Icon

    비밀댓글입니다

  8. Blog Icon
    guest

    프로그램은 작년에 끝내놓은 상황이고 그 동안 데이터 작업을 진행하다 앱을 완료하려고 하다보니 v1방식은 올해 3월 종료되었다고 나오네요. 그동안 디버그 키로 작업했는데 미리 릴리즈 키를 받아놓지 않은 상황이라 난감한 상태입니다.

    V2로 인증만 받아놓고 V1방식으로 된 소스를 유지할 수 있는지요? 글 상단에 기존 MapView를 바로 사용할 수도 있다고 하셨는데 시간이 너무 지체되어 1차버전은 현재 상태로 마무리했으면 합니다. 지금 소스는 MapActivity, ItemizedOverlay, Overlay, dialog 등을 사용하는데 V2 방식으로 포팅하려면 시간이 부족할 듯 하며, 현재의 기능을 다 완벽하게 컨버전할 수 있을지 확신이 안서네요.

    바쁘시겠지만 답변 부탁드립니다. ^^;

  9. 오히려 조금만 시간을 더 투자하신다면 v1보다 v2가 훨씬 기능이 강력하기 때문에 덜 수고하면서도 더 좋은 품질의 앱을 만들 수 있을 거라 생각합니다~

  10. Blog Icon
    고슴7

    커니님과 안드로이드 펍의 갈무리님의 글들을 도움받아서

    3일동안 고생했던 맵 띄우기가 드디어 성공했습니다 !

    아 그리고 매니패스트 파일에서 어플리케이션 안에

    <uses-library android:name="com.google.android.maps" />

    이부분을 추가해야 합니다.

    아무쪼록 감사드려요 ^ㅡ^ 더운데 수고하세요!!!

  11. Blog Icon
    구기웅

    gps이미지 변경 및 zoomController 이미지 변경 이 가능한가요 ? 가능하다면 동적구성후에 줌버튼 클릭시에 진행해줘야 하는 작업을 어떻게 얻어오나요 ?
    또한 커스텀 마커 사용 및 말풍선이 클릭전에 항상 떠있게 진행이 가능한가요 ?
    응용부분에 대한 정보도 올려주시면 감사하겠습니다 .ㅠ

  12. Blog Icon
    벤지

    공부하는데 큰 도움이 되었습니다...
    감사합니다..