본문 바로가기
Android 기법/# Study

[Android]위치 및 구글맵 살펴보기(Google Maps)

by 퍼즐잎 2017. 7. 16.



구글맵을 사용하기에 앞서서 먼저 API KEY가 필요하다.


https://developers.google.com/maps/documentation/android-api/signup?hl=ko

[공식 문서]


상단의 페이지를 통해서 API 키를 가져올 수 있다.



가지고 온 키는 다음 위치에 추가한다.

(value의 String이 아니다.)



[gradle.properties 에 추가한다]



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
apply plugin: 'com.android.application'
 
android {
    compileSdkVersion 26
    buildToolsVersion "26.0.0"
    defaultConfig {
        ...
        resValue "string""google_maps_key", (project.findProperty("GOOGLE_MAPS_API_KEY") ?: "")
        ...
    }
     
}
 
dependencies {
    ...
    compile 'com.google.android.gms:play-services:11.0.2'
    ...
}
 
cs

[build.gradle에는 주황색으로 되어있는 부분을 추가한다]


play-services의 버전은 안드로이드 스튜디오 환경마다 권장하는게 다를 수 있다.



그리고 AndroidManifest.xml 에 다음과 같이 추가한다.

application을 닫기 전에 추가해야 한다.



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
  <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
 
        <meta-data
            android:name="com.google.android.geo.API_KEY"
            android:value="@string/google_maps_key"/>
 
        <meta-data
            android:name="com.google.android.gms.version"
            android:value="@integer/google_play_services_version" />
 
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
 
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>
cs


+a


모든 설정을 끝마친 다음 아까 API 키를 받은

[https://console.developers.google.com]


에서 SHA-1 인증서 지문을 추가한다.

(안해도 동작은 하는 것 같은데 ...)




Android Studio의 Terminal에 써있는대로 입력해도 되고

만약에 없다고 에러가 발생하는 분은


keytool -list -v -keystore c:/users/cmtyx/.android/debug.keystore -alias androiddebugkey -storepass android -keypass android


빨간 부분에 자신의 경로를 입력하고 사용하면 된다.

[debug.keystore는 자동으로 생성되는 것이라고 한다]




+추가


일반 지도 예제는 문제없이 사용 가능하지만 다른 맵 기능을 사용하기 위해서는

API Console의 라이브러리에서 따로 사용설정을 해줘야 한다.









이제 기본적인 설정은 끝났고 테스트를 위해 다음과 같이 작성하면 된다.



[activity_main.xml]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="com.tistory.puzzleleaf.boostmap.MainActivity">
 
    <fragment
        xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:id="@+id/map"
        android:name="com.google.android.gms.maps.SupportMapFragment"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintRight_toRightOf="parent" />
 
</android.support.constraint.ConstraintLayout>
 
cs



[MainActivity.class]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
 
public class MainActivity extends AppCompatActivity implements OnMapReadyCallback {
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
 
        SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager()
                .findFragmentById(R.id.map);
        mapFragment.getMapAsync(this);
    }
 
    @Override
    public void onMapReady(GoogleMap googleMap) {
        LatLng sydney = new LatLng(-33.852151.211);
        googleMap.addMarker(new MarkerOptions().position(sydney)
                .title("Marker in Sydney"));
        googleMap.moveCamera(CameraUpdateFactory.newLatLng(sydney));
 
    }
}
cs





LatLng에 써있는 -33.852, 151.211 위치에 마커를 추가하고 그쪽으로 지도의 카메라를 이동시킵니다.




https://developers.google.com/maps/documentation/android-api/controls?hl=ko


지도에서 우측에 +,- 버튼과 상단에 현재 위치를 찾아가는 버튼을 설정하기 위해서 아래와 같이 설정한다.



1
2
3
4
5
6
7
8
9
10
11
12
13
  @Override
    public void onMapReady(GoogleMap googleMap) {
         //우측 상단에 위치 버튼 
        if (ActivityCompat.checkSelfPermission(getContext(), Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED &&
                ActivityCompat.checkSelfPermission(getContext(), Manifest.permission.ACCESS_COARSE_LOCATION) == PackageManager.PERMISSION_GRANTED) {
            googleMap.setMyLocationEnabled(true);
            googleMap.getUiSettings().setMyLocationButtonEnabled(true);
        }
        ...
        //+,- 버튼
        googleMap.getUiSettings().setZoomControlsEnabled(true);
           ...
    }
cs



상단의 위치버튼을 나타내기 위해서는 Permission을 설정해야 나타나게 된다.



1
2
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
cs



1
2
3
4
5
6
7
8
9
10
11
    private void setPermission(){
        if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED &&
                ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
           
            ActivityCompat.requestPermissions(this,
                    new String[]{android.Manifest.permission.ACCESS_FINE_LOCATION}, 1);
            ActivityCompat.requestPermissions(this,
                    new String[]{Manifest.permission.ACCESS_COARSE_LOCATION}, 1);
            return;
        }
    }
cs


[Permission 추가를 위한 간단한 코드]



1
2
googleMap.addMarker(new MarkerOptions().position(mkLatLng)
                    .title(temp.getName()).snippet(temp.getAddress()).draggable(true));
cs


[추가하는 Marker에 Drag 가능한 속성을 추가한다]



1
2
3
4
5
6
7
8
9
10
11
  googleMap.setOnMarkerDragListener(new GoogleMap.OnMarkerDragListener() {
            @Override
            public void onMarkerDragStart(Marker marker) {
            }
            @Override
            public void onMarkerDrag(Marker marker) {
            }
            @Override
            public void onMarkerDragEnd(Marker marker) {
            }
        });
cs


[Marker Drag를 위한 코드]




구글 맵에서 주소를 검색할 수 있는 장소 자동완성 기능을 제공한다.

Google Place API 를 이용하면 사용이 가능하다.




[https://console.developers.google.com 에서 사용 설정을 하지 않으면 제대로 동작하지 않는다.]




1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
    ...
    Intent intent = new PlaceAutocomplete.IntentBuilder(PlaceAutocomplete.MODE_FULLSCREEN).build(getActivity());
    startActivityForResult(intent, SEARCHADDRESS);
    ...
 
    @Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        if (requestCode == SEARCHADDRESS) {
            if (resultCode == RESULT_OK) {
                Place place = PlaceAutocomplete.getPlace(getContext(), data);
                 //장소 정보를 얻어옴
            } else {
 
            }
        }
    }
    ...
cs






댓글