실행환경

 Desktop

 조립식

 CPU

 Intel(R) Core(TM) i7-3770 3.50GHz

 Memory

 4 GB

 OS

 Window 7 Professional 32bit

 Java

 1.7.0_51

 Android

 SDK : 4.4.2 (KitKat), Google APIs 4.4.2

 TEST : Galaxy S3 4.3(Jelly Bean)

 WebServer

 Apache Tomcat 7.0

 DB

 MySQL 5.6.15


문제점

  • 구글맵에 여러개의 마커를 추가하려고한다.
  • 이동경로를 표시하기 위해 마커를 사용하고, 마커를 찍는 방법은 다른 스레드를 생성하여 실행한다.


해결방안

구글맵의 문제가 아니었다. 안드로이드에서는 화면 UI를 변경하려면 하나의 액티비티에서만 가능하다.

그렇게 때문에 main이 아닌 다른 스레드에서 마커를 찍어주니 에러가 발생하였다.

그래서 Handler를 만들어주고 다른 Thread에서 호출하였다.


 실행환경

 Desktop

 조립식

 CPU

 Intel(R) Core(TM) i7-3770 3.50GHz

 Memory

 4 GB

 OS

 Window 7 Professional 32bit

 Java

 1.7.0_51

 Android

 SDK : 4.4.2 (KitKat), Google APIs 4.4.2

 TEST : Galaxy S3 4.3(Jelly Bean)

 WebServer

 Apache Tomcat 7.0

 DB

 MySQL 5.6.15


Google Maps Android API v2 (구글 맵) 사용하기


구글에서 제공하는 사용 방법(링크)


1. 구글맵 라이브러리 다운로드 및 프로젝트 생성하기

2. 새 프로젝트에서 구글맵 라이브러리 프로젝트 가져오기

3. 인증키 발급받기

 3-1. 디버깅용

  3-1-1. cmd창에서 확인하기

  3-1-2. 이클립스에서 확인하기

 3-2. 릴리즈용

4. 구글맵 인증키 발급받기

5. 구글맵 사용하기



1. 구글맵 라이브러리 다운로드 및 프로젝트 생성하기

 1-1. Google Play services SDK 다운로드하기

  Android SDK Manager - Google Play services 를 설치한다.


 1-2. 구글맵 라이브러리를 가져오기.

  1-2-1. Ctrl + N -> Android Project from Existing Code 를 선택한다.


  1-2-2. Root Directory 에 설치한 구글맵 라이브러리 경로를 지정해준다.

SDK경로\extras\google\google_play_services\libproject\google-play-services_lib



2. 구글맵을 사용할 새로운 프로젝트 생성하기.

  2-1. 프로젝트를 생성하고, 프로젝트를 오른쪽 클린한 후 Properties(속성)를 선택한다.

 


  2-2. 하단의 Library창에서 Add를 통해 가져온 프로젝트 추가해준다.





3. 인증키 발급받기

 3-1. 디버깅용 키 지문 확인하기.

  3-1-1. cmd(commend)창에서 확인하기.

1. OS별로 아래 경로로 이동

 OS X, Linux

  ~/.android

 윈도우 xp

  C:/Documents and Settings/사용자 계정/.android

 윈도우 7

  C:/Users/사용자 계정/.android


2. 명령어 실행

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

 혹은 -keystore 값에 경로를 함께 지정해도 된다.


  3-1-2. 이클립스에서 확인하기

   Window - Preferences -> Android - Build


 3-2. 릴리즈용

....


4. SHA1 지문으로 구글 키 발급받기

 4-1. Google APIs console로 이동한 뒤에 프로젝트를 생성한다.


4-2. 좌측 메뉴중 APIs & auth - APIs 에서 Google Maps Android API v2 를 찾아 활성화시켜준다.


 4-3. APIs & auth - Credentials 에서 Public API access의 CREATE NEW KEY를 선택하고, Android key를 선택한다.



 4-4. 아래와 같은 창이 나오면 위에서 확인했던 SH1키와 같이 현재 작업중인 패키지를 넣는다.

예) [SHA1지문];[현재 작업중인 패키지 이름]

AF:3B:EF:67:CE:A1:5C:7D:C2:3F:C4:99:8B:63:7F:F5:92:83:E2:11;com.example.googlemap_v2



 4-5. 아래와 같이 키가 발급되었다.


5. 구글 맵 사용하기(code)

 5-1. 매니페스트 설정하기.

  5-1-1. Manifest 탭


   5-1-2. Application 탭(Meta Data 2개를 추가해야 한다.)

   5-1-3. Permissions 탭

1개의 permission과 7개의 user-permission을 추가한다.

<permission
    android:name="com.example.maptest.permission.MAPS_RECEIVE"
    android:protectionLevel="signature" >
</permission>
<uses-permission android:name="com.example.maptest.permission.MAPS_RECEIVE" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="com.google.android.providers.gsf.permission.READ_GSERVICES" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />



JAVA CODE

   5-1-4. AndroidManifest.xml에서 바로 추가할 수도 있다.

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.maptest"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk
        android:minSdkVersion="8"
        android:targetSdkVersion="19" />

    <uses-feature
        android:glEsVersion="0x00020000"
        android:required="true" />

    <permission
        android:name="com.example.maptest.permission.MAPS_RECEIVE"
        android:protectionLevel="signature" >
    </permission>

    <uses-permission android:name="com.example.maptest.permission.MAPS_RECEIVE" />
    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="com.google.android.providers.gsf.permission.READ_GSERVICES" />
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name="com.example.maptest.MapTest"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

        <meta-data
            android:name="com.google.android.maps.v2.API_KEY"
            android:value="KEY" />
        <meta-data
            android:name="com.google.android.gms.version"
            android:value="@integer/google_play_services_version" />
    </application>

</manifest>


  5-2. layout에 fragment 추가하기

<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=".MapTest" >

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

</RelativeLayout>


  5-3. MainActivity에 FragmentActivity 상속 받기

public class MainActivity extends FragmentActivity {

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
	}

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

}


참고자료


+ Recent posts