참고서적:모두의 안드로이드
*제가 직접 사서 참고하고 있습니다.
개발환경:우분투 20.04 lts
지도위에 위치를 표시하고 수원의 광광지를 마커로 표시할 지도앱을 만들어 볼 것입니다.
[1.프로젝트 google map Acritivty생성]
*프로젝트생성시 플레이 스토어 이름 유무 확인하는 방법.
https://play.google.com/store/apps/details?id=패키지명
여기서 패키지명은 프로젝트 만들때 그 프로젝트 명을 입력해주면 됩니다. 저는 com.example.mapsw 으로 확인해보겠습니다.
등록된 이름이 아니면 찾을 수 없다는 페이지가 뜹니다.
[2.구글 지도 API 설정하기]
구글 지도를 사용하려면 구글계정으로 API키를 발급 받아야 합니다.API키는 일종의 개인번호라고 보면 됩니다.
아래 해당 링크로 접속합니다.
https://console.cloud.google.com/google/maps-apis?pli=1
그리고 구글 아이디가 있으면 로그인하고 없으면 만들어줍니다.
그 후 프로젝트 만들기를 선택합니다.
프로젝트 이름을 설정해주시고 만들기를 눌러줍니다.
그 후 API 및 서비스로 이동합니다.
사용자 인증 정보 탭을 클릭하고 상단의 사용자 인증 정보 만들기를 눌러줍니다.그러면 API 키 라는 메뉴가 뜰것입니다. 클릭해줍니다
그러면 아래화면처럼 API키가 생성됩니다.
[3.생성한 API 키 복사 붙여넣어주기]
<string 태그에 Your_key_here부분에 복사한 api키를 붙여넣습니다,
[4.구글 클라우드 플랫폼 콘솔에서 구글지동 api를 사용 설정]
라이브러리를 클릭해줍니다.
Maps SDK for Android를 클릭합니다.
사용 버튼을 눌러줍니다.
[5.지도에서 원하는 위치를 버튼을 눌렀을 때 화면에 띄우기]
app/java/패키지명/MapsActivity.java 파일을 엽니다.
mMap.moveCamera(CameraUpdateFactory.newLatLng(sydney));
에서 기본 위치가 시드니로 되어있습니다.
실행해보면 이런식으로 시드니로 위치가 잡혀 있습니다.
[5.1 구글 지도에 현재 위치 표시하기:AndroidManifest.xml 설정]
1)위치 정보에 접근할 수 있는 권한을 앱에 설정을 합니다. app/manifests폴더에 AndroidManifest.xml파일을 엽니다.
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION " /> <!-- 추가 -->
[5.2 MapsActivity.java 파일 설정]
자바 파일에서도 권한 설정을 해야합니다.
[변경 전]
public class MapsActivity extends FragmentActivity implements OnMapReadyCallback {
private GoogleMap mMap;
@Override
[변경 후]
public class MapsActivity extends FragmentActivity implements
GoogleMap.OnMyLocationButtonClickListener,//추가 위치버튼을 눌렀을 때 이러나는 이벤트 정의
GoogleMap.OnMyLocationClickListener,//추가
OnMapReadyCallback {
private GoogleMap mMap;
private int MY_LOCATION_REQUEST_CODE=1; //추가 문자에 숫자를 넣는것을 프로그래밍에서는 정의한다 라고 합니다.
그리고 추가코드로 인한 클래스 자동생성(ALT+ENTER)누르면 생성됩니다.
[5.3 메인 액티비티 MapsActivity.java파일에서 oncreate 메서드 코드 추가]
변경 전
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_maps);
// Obtain the SupportMapFragment and get notified when the map is ready to be used.
SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager()
.findFragmentById(R.id.map);
mapFragment.getMapAsync(this);
}
변경 후
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_maps);
// Obtain the SupportMapFragment and get notified when the map is ready to be used.
SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager()
.findFragmentById(R.id.map);
mapFragment.getMapAsync(this);
}
/*추가부분 */
public void onRequestPermissonResult(int requestCode,String[] permissions,int[] grantResult){
if(requestCode == MY_LOCATION_REQUEST_CODE){
if(permissions.length == 1 &&
permissions[0] == Manifest.permission.ACCESS_FINE_LOCATION &&
grantResult[0] == PackageManager.PERMISSION_GRANTED) {
if(checkCallingPermission(Manifest.permission.ACCESS_COARSE_LOCATION) !=
PackageManager.PERMISSION_GRANTED &&
checkCallingPermission(Manifest.permission.ACCESS_COARSE_LOCATION)!=
PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(this,new String[]{
Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.ACCESS_COARSE_LOCATION}, 1);
}
mMap.setMyLocationEnabled(true);
}
}
}
[추가 부분 코드 해석]
위치 정보에 접근 권한이 있다고 확인되면 onRequestPermissionResult() 함수로 돌아옵니다.
그리고 위치 정보에 접근 권한 요청이 들어오면 requestCode 의 값을 1로 만듭니다.
이전에 정의했던 requestCode 값과 MY_LOCATION_REQUEST_CODE값이 같으므로 권한을 주는
ActivityCompat.requestPermissions(this,new String[]
{
Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.ACCESS_COARSE_LOCATION
},1);}
부분이 실행됩니다.
그리고 아래코드는 내 위치에 접근할 수 있게 허용합니다.
mMap.setMyLocationEnabled(true);
[5.4 MapsActivity.java에서 onMapReady함수 설정]
변경 전
@Override
public void onMapReady(GoogleMap googleMap) {
mMap = googleMap;
// Add a marker in Sydney and move the camera
LatLng sydney = new LatLng(-34, 151);
mMap.addMarker(new MarkerOptions().position(sydney).title("Marker in Sydney"));
mMap.moveCamera(CameraUpdateFactory.newLatLng(sydney));
}
@Override
public void onMapReady(GoogleMap googleMap) {
mMap = googleMap;
// 추가코드
if(checkCallingPermission(Manifest.permission.ACCESS_FINE_LOCATION)!=
PackageManager.PERMISSION_GRANTED &&
checkSelfPermission(Manifest.permission.ACCESS_COARSE_LOCATION) !=
PackageManager.PERMISSION_GRANTED){
ActivityCompat.requestPermissions(this,new String[]{
Manifest.permission.ACCESS_FINE_LOCATION,
Manifest.permission.ACCESS_COARSE_LOCATION},1);
}
mMap.setMyLocationEnabled(true);
mMap.setOnMyLocationButtonClickListener(this);
mMap.setOnMyLocationClickListener(this);
}
[5.5 위치 클릭했을때 메서드 오버라이드]
변경 전
@Override
public boolean onMyLocationButtonClick() {
return false;
}
@Override
public void onMyLocationClick(@NonNull Location location) {
}
변경 후
@Override
public boolean onMyLocationButtonClick() {
Toast.makeText(this,"MyLocation clicked", Toast.LENGTH_SHORT).show();
return false;
}
@Override
public void onMyLocationClick(@NonNull Location location) {
Toast.makeText(this,"Current location:\n" + location, Toast.LENGTH_LONG).show();
}
[코드 해석]
내 위치 버튼을 클릭 했을 때 내 위치로 이동하게 되는 코드 입니다.
[6.실행화면]
이런 화면이 뜨면 앱위치 정보를 사용해도 되는지에 대한 것에 대해 묻는 것이므로 "while using the app"을 누릅니다.
그런데 위치가 Googleplex로 나옵니다.
이는 에뮬레이터에는 GPS가 없어서 현재 내위치가 아닌
구글본사 위치가 표시됩니다.
내 위치 버튼을 눌렀을 때 원하는 곳의 위치를 설정해줘야 합니다.
맨밑에 ... 이라고 되어있는 MORE 아이콘을 누릅니다.
그러면 아래와 같은 화면이 나옵니다.
검색창에 위치를 타이핑하고 원하는 위치를 클릭후 SAVE POINT 를 클릭합니다.
그러면 주소와 위도(latitude),경도(longtitude)를 확인하는 창이 뜨면 ok 를 누릅니다.
그리고 오른쪽 하단에 set location 을 누르고 에뮬레이터를 종료합니다.
[7.수정 후 실행화면]
그리고 다시 에뮬레이터를 실행 시키고 내 위치 버튼을 클릭하면 아까 세팅했던 장소로 이동합니다.
(저는 수원 화성으로 해놓았습니다)
'오늘의 공부 > android' 카테고리의 다른 글
[모두의 안드로이드] 6일차 관광지도 앱 만들기 3.앱시작화면 만들기 (0) | 2020.10.06 |
---|---|
[모두의 안드로이드] 5일차 관광지도 앱 만들기 .2 마커 표시하기 (0) | 2020.10.05 |
[모두의 안드로이드]4일차: 대화창 띄우기 (0) | 2020.09.28 |
[모두의 안드로이드]4일차: 프로그레스바로 대기상태 표시하기 (0) | 2020.09.28 |
[모두의 안드로이드]3일차: 스크롤 화면 만들기 (0) | 2020.09.25 |