본문 바로가기

ANDROID의 속삭임

[android][googlePlayService]googleMap 연동.

0. 사전 작업 [API key발급 및 API 서비스 사용설정.]

1. eclipse > Window > Android SDK Manager 에서 [Extras]packages를 확장하여 최신 GooglePlayServices를 설치한다.




2.  API Key발급 받기!

가. URL : https://code.google.com/apis/console/ 으로 접속.

나. 중앙에 "Create project..."라는 버튼을 선택하여, 프로젝트를 생성 한다.

다. LNB에 Services라는 메뉴를 선택하면, Google에서 제공하는 Services가 있으며, 그중 원하는 서비스를 선택한다.

        - 우리는 구글 Map을 사용 할 것이기 때문에, Google Maps Android APIv2를 선택한다. 

        - 선택하고 나면, OFF가 ON으로 변한다.

라. LNB에 API Access를 선택하면, API Key항목이 보이고 키값이 적혀 있는것을 확인 할수 있다.


0. 사전 작업 [API library project.]

1. library를 사용하기 위해서는 프로젝트에 Import시켜야 된다. 그후 해당 프로젝트를 연결함으로써 해당 구글의 확장 API를 사용 할수 있다.

가. File > import 를 선택한다. 

나. Import 창이 출력이 되면은 Android항목을 확장하고 "Existing Android Code Into Workspace"를 선택하고, NEXT선택.

다. Import Projects 화면에서는 "Browse..."버튼을 선택하여 "ANDROID_SDK_HOME\extras\google\google_play_services\libproject\google-play-services_lib"폴더를 선택 하고, "확인"을 누른다.

라. 잘 진행하였다면, projects 리스트에 google-play-servies_lib가 생긴것을 확인 할수 있으며, 체크하고, "Finish"를 누른다.

마. 이렇게 하면 Package Explorer를 확인하면 해당 프로젝트가 Import된것을 볼수 있다.

바. 이것을 사용 하기 위해서는 작업을 진행 할 프로젝트에서 마우스 오른쪽 버튼을 눌러 Propertiese(속성 : 프로젝트 속성)을 연다.

사. android 메뉴를 선택하고, library항목에서 add를 눌러 사용할 library를 선택하여 OK를 눌러 추가해준다. 그리고 창을 확인을 눌러 완료한다.

아. 프로젝트에 설치하기 위해서, 작업을 진행 할 프로젝트 마우스 오른쪽버튼을 눌러 Android Tools를 누르고 Add Support Library... 항목을 선택한다.

차. 이렇게 진행 하면 패키지 설치 화면을 볼수 있다. 여기서 Accept를 선택하고 Install을 진행하여 완전히 적용시킨다.

카. 여기까지 완료 되었다면, API 확장 라이브러리가 적용 된것이다.



1. /AndroidManifest.xml 수정

<?xml version="1.0" encoding="utf-8"?>

<manifest xmlns:android="http://schemas.android.com/apk/res/android"

    package="com.example.hellogooglemap"

    android:versionCode="1"

    android:versionName="1.0" >


    <uses-sdk

        android:minSdkVersion="8"

        android:targetSdkVersion="17" />


    <!-- API Key와 연동하여 구글맵 데이터를 받아오는데 필요. -->

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

    <uses-permission android:name="com.example.hellogooglemap.permission.MAPS_RECEIVE"/>

<!-- 인터넷 사용권한을 받아 서버에서 지도의 조각 이미지를 다운받는데 사용. -->

    <uses-permission android:name="android.permission.INTERNET" />

    <!-- 외부저장소에 지도 캐시 데이터 저장 -->

    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

    <!-- 위치를 Wifi나 기지국 정보로 찾는데 필요 -->

    <uses-permission android:name="android.permission.ACCESS_COARASE_LOCATION" />

    <!-- 위치를 GPS로 찾는데 필요 -->

    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />

    <!-- 구글 윕 기반 서비스 API에 접근 -->

    <uses-permission android:name="com.google.android.providers.gsf.permission.READ_GSERVICES" />

    <!-- OpenGL ES Version 2 사용 정의 [Google Map이 Open GL2.0을 사용함에 따라 지원하지 않는 단말기에서는 설치되지 않도록 하기 위함] -->

    <uses-feature

        android:glEsVersion="0x00020000" 

        android:required="true"/>

    

    <application

        android:allowBackup="true"

        android:icon="@drawable/ic_launcher"

        android:label="@string/app_name"

        android:theme="@style/AppTheme" >

   <!--API키 입력-->

    <meta-data

        android:name="com.google.android.maps.v2.API_KEY"

        android:value="[API KEY]"/>

        <activity

            android:name="com.example.hellogooglemap.MainActivity"

            android:label="@string/app_name" >

            <intent-filter>

                <action android:name="android.intent.action.MAIN" />


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

            </intent-filter>

        </activity>

    </application>


</manifest>

- 굵게 표시된부분이 수정된 부분이다.


2. Activity_main.xml 수정

<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"

    android:paddingBottom="@dimen/activity_vertical_margin"

    android:paddingLeft="@dimen/activity_horizontal_margin"

    android:paddingRight="@dimen/activity_horizontal_margin"

    android:paddingTop="@dimen/activity_vertical_margin"

    tools:context=".MainActivity" >


    <fragment android:id="@+id/fragment1"

        android:name="com.google.android.gms.maps.SupportMapFragment" 

        android:layout_width="match_parent"

        android:layout_height="match_parent"/>


</RelativeLayout>


3. MainActivity.java 수정

package com.example.hellogooglemap;


import android.os.Bundle;

import android.app.Activity;

import android.view.Menu;


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;

}


}


4. 확인 및 완료

- 확인을 할때는 인터넷이 가능한 단말기에서 확인을 하기 바란다.





※ 지도 모양 변경.

- GoogleMap.setMapType(int type) 사용.

- MAP_TYPE_NORMAL : 기본맵

- MAP_TYPE_SATELLITE : 위성맵

- MAP_TYPE_TERRAIN : 지형 맵(고도표시)

- MAP_TYPE_NONE : 맵없이 출력

package com.example.hellogooglemap;


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 googleMap;

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

  googleMap = ((SupportMapFragment)(getSupportFragmentManager().findFragmentById(R.id.fragment1))).getMap();


googleMap.setMapType(GoogleMap.MAP_TYPE_NORMAL);

}


@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;

}


}



※ 카메라 이동

- GoogleMap.moveCamera(CameraUpdate update) : 애니메이션 없이 이동.

- GoogleMap.animateCamera(CameraUpdate update) : 이동 애미메이션 존재

- 기존 V1 Google maps 에서 animateTo 함수와 동일한 역할

- CameraUpdate 라는 클래스를 인자로 받는데, 해당 클래스 CameraUpdateFactory를 이용하여 사용.

- CameraUpdateFactory를 사용하여 Zoom In/Out, Scroll, 좌표설정 등의 다양한 설정 값을 줄 수 있음.

   (참고 : LatLng = 좌표 저장 용도, LatLng(double, double)형태)

package com.example.hellogooglemap;


import android.os.Bundle;

import android.support.v4.app.FragmentActivity;

import android.view.Menu;


import com.google.android.gms.maps.CameraUpdateFactory;

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

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

import com.google.android.gms.maps.model.LatLng;


public class MainActivity extends FragmentActivity {


GoogleMap googleMap;

LatLng loc = new LatLng(22,122);//위지정보 설정

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

googleMap = (

    (SupportMapFragment)(

                getSupportFragmentManager().findFragmentById(R.id.fragment1)

                           )

    ).getMap();

//해당위치로 카메라 이동.

googleMap.animateCamera(CameraUpdateFactory.newLatLng(loc));

//googleMap.moveCamera(CameraUpdateFactory.newLatLng(loc));//줌인 아웃 지원.

}


@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;

}


}



 Marker

- GoogleMap.addMarker 사용

- Marker에 Title,snippen정보 입력 가능.

- Marker모양 변경 가능.

- 프로젝트 폴더 > res > drawable-hdpi에 사용 할 그림 추가.(마커 이미지로 사용 할것.) ※ 이미지는 png만 허용

- eclipse 에서 자동으로 Resource 생성(gen > R.java에 아이콘에 Resource가 생성되지 않는다면 Refresh해볼것)

- R.drawable.[아이콘 명]으로 사용.

package com.example.hellogooglemap;


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;

import com.google.android.gms.maps.model.LatLng;

import com.google.android.gms.maps.model.MarkerOptions;


public class MainActivity extends FragmentActivity {


GoogleMap googleMap;

LatLng loc = new LatLng(22,122);//위지정보 설정

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

googleMap = (

    (SupportMapFragment)(

                getSupportFragmentManager().findFragmentById(R.id.fragment1)

                           )

    ).getMap();

//마커 입력 

    googleMap.addMarker(new MarkerOptions().position(loc).title("원넷뷰").snippet("정보통신기술 연구소.").icon(BitmapDescriptorFactory.fromResource(R.drawable.markerIcon)));

}


@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;

}


}




Polyline 

- GoogleMap.addPolyline(PolylineOption a) 함수 사용

- PolylineOption 에서 설정한 좌표 사이에 선생성.

- 색,굵기 함수 설정 가능.

package com.example.hellogooglemap;


import android.graphics.Color;

import android.os.Bundle;

import android.support.v4.app.FragmentActivity;

import android.view.Menu;


import com.google.android.gms.maps.CameraUpdateFactory;

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

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

import com.google.android.gms.maps.model.BitmapDescriptorFactory;

import com.google.android.gms.maps.model.LatLng;

import com.google.android.gms.maps.model.MarkerOptions;

import com.google.android.gms.maps.model.Polyline;

import com.google.android.gms.maps.model.PolylineOptions;


public class MainActivity extends FragmentActivity {


GoogleMap googleMap;

LatLng loc = new LatLng(22,122);//위지정보 설정

PolylineOptions rectOptions = new PolylineOptions()

.add(new LatLng(36.234324,123.45454))

.add(new LatLng(36.234324,123.45454))

.add(new LatLng(36.234324,123.45454))

.add(new LatLng(36.234324,123.45454))

.add(new LatLng(36.234324,123.45454))

.color(Color.RED);

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

googleMap = (

    (SupportMapFragment)(

                getSupportFragmentManager().findFragmentById(R.id.fragment1)

                           )

    ).getMap();

   //폴리라인

   Polyline polyline = googleMap.addPolyline(rectOptions);

   

   

}


@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;

}


}




※ https://developers.google.com/maps/documentation/android/





- 예제 자바 소스.


package com.example.hellogooglemap;


import android.os.Bundle;

import android.support.v4.app.Fragment;

import android.support.v4.app.FragmentActivity;

import android.view.Menu;


import com.google.android.gms.maps.CameraUpdateFactory;

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

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

import com.google.android.gms.maps.model.BitmapDescriptorFactory;

import com.google.android.gms.maps.model.LatLng;

import com.google.android.gms.maps.model.MarkerOptions;


public class MainActivity extends FragmentActivity {


    GoogleMap googleMap;


    @Override

    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_main);


        //supportFragment관리자를 이용하여 해당 Fragment를 찾아온다.

        Fragment fragment = getSupportFragmentManager().findFragmentById(R.id.fragment1);

        SupportMapFragment supportMapFragment = (SupportMapFragment)fragment;

        //플래그 먼트로 부터 Map을 받는다.

        googleMap = supportMapFragment.getMap();


        /////////////////////////////////////////////////////////////////////

        //              Google Map 예제 Start                              //

        /////////////////////////////////////////////////////////////////////

        MarkerOptions marker = new MarkerOptions();//마커 생성

        LatLng companyLoc = new LatLng(37.477651,127.045603);// 위치정보 생성

        marker.position(companyLoc);//마커의 위치 설정

        marker.icon(BitmapDescriptorFactory.fromResource(R.drawable.marker));

        marker.title("원넷뷰");//마커 제목

        marker.snippet("정보통신기술연구소");//마커내용

        marker.visible(true);

        googleMap.addMarker(marker);//구글맵에 마크 추가


        //화면을 해당 위치로 이동!

        googleMap.moveCamera(CameraUpdateFactory.newLatLng(companyLoc));


        //화면을 줌인 parm : 줌인배율, 줌인 애니메이션 속도,

        googleMap.animateCamera(CameraUpdateFactory.zoomTo(2),3000,null);

        googleMap.animateCamera(CameraUpdateFactory.zoomTo(3),3000,null);

        googleMap.animateCamera(CameraUpdateFactory.zoomTo(5),3000,null);

        googleMap.animateCamera(CameraUpdateFactory.zoomTo(8),3000,null);

        googleMap.animateCamera(CameraUpdateFactory.zoomTo(13),3000,null);

        /////////////////////////////////////////////////////////////////////

        //              Google Map 예제 End                                //

        /////////////////////////////////////////////////////////////////////


    }


    @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;

    }


}