본문 바로가기

오늘의 공부/android

[모두의 안드로이드]4일차:관광지도 앱 만들기 01

참고서적:모두의 안드로이드

*제가 직접 사서 참고하고 있습니다.

개발환경:우분투 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

 

Google Cloud Platform

하나의 계정으로 모든 Google 서비스를 Google Cloud Platform을 사용하려면 로그인하세요.

accounts.google.com

그리고 구글 아이디가 있으면 로그인하고 없으면 만들어줍니다.

 

그 후 프로젝트 만들기를 선택합니다.

 

프로젝트 이름을 설정해주시고 만들기를 눌러줍니다.

 

 

 

그 후 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파일을 엽니다.

 

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.수정 후 실행화면]

그리고 다시 에뮬레이터를 실행 시키고 내 위치 버튼을 클릭하면 아까 세팅했던 장소로 이동합니다.

 

(저는 수원 화성으로 해놓았습니다)