본문 바로가기

아옳옳의 코딩공부/아옳옳의 안드로이드스튜디오

2021-06-14안드로이드 스튜디오 (구글맵 사용 하기 )

반응형

위치 기반서비스로 나의 현재 위치 알아내기 

현재 나의 위치 정보를 알아야 구글 지도를 활용할수 있다. 

코드를 보고 일단 나의 위치 정보 확인하는 것 부터 시작하자 

public class MainActivity extends AppCompatActivity {

    TextView textView;

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

        ActivityCompat.requestPermissions(this, new String[] {Manifest.permission.ACCESS_FINE_LOCATION,
        Manifest.permission.ACCESS_COARSE_LOCATION},0);

        textView=findViewById(R.id.textView);
        Button button = findViewById(R.id.button);

        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                startLocationService();
            }
        });

    }

    public void startLocationService(){
        //거리와 
        long time =  10000;
        float distance = 0;
        //위치 관리자 객체 잠조 
        LocationManager manager = (LocationManager)getSystemService(LOCATION_SERVICE);
        try{
            //최근 확인했던 위치정보 확인 
            Location location = manager.getLastKnownLocation(LocationManager.GPS_PROVIDER);
            if(manager!= null){
                double latitude = location.getLatitude();
                double longitude = location.getLongitude();
                textView.setText("최근의 내위치 " + latitude + longitude);
            }
            
            GPSListener gpsListener = new GPSListener();
            
            //로케이션이 변경되면 호출 (로케이션 매니저 , 업데이트시간 간격 , 거리가 얼마나 이동했을때 업데이트 , 콜백할 인스턴스 변수 
            manager.requestLocationUpdates(LocationManager.GPS_PROVIDER,time,distance,gpsListener);
            manager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER,time,distance,gpsListener);

        }catch (SecurityException e){

        }

    }
    //GPS리스너 클래스 정의  LocationListener를 구현 해줘야함 
    class GPSListener implements LocationListener {

        @Override // 위치 정보가 변경될시 호출되는 메소드 아래 다른 메소드는 잘 안씀 
        public void onLocationChanged(@NonNull Location location) {
            double latitude = location.getLatitude();
            double longitude = location.getLongitude();
            textView.setText("내위치 " + latitude + longitude);
        }

        @Override
        public void onStatusChanged(String provider, int status, Bundle extras) {

        }

        @Override
        public void onProviderEnabled(@NonNull String provider) {

        }

        @Override
        public void onProviderDisabled(@NonNull String provider) {

        }
    }

}

 

이렇게 내위치의 위도와 경로를 받았다면 이제 본격적으로 구글 맵을 활용해보자 

 

검색해서 외부 라이브러리 추가해준다 .( 자세한 사항 교재 참고 하자 ) 

 

 

물어봐야할것들이 많아서 코드만 올려놓고 내일 물어볼것들 물어보자

 

메인

public class MainActivity extends AppCompatActivity {

    SupportMapFragment mapFragment;
    GoogleMap map;
    double latitude ; // 좌표값을 받기 위한 변수
    double longitude ;// 좌표값을 받기 위한 변수

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

        ActivityCompat.requestPermissions(this, new String[] {Manifest.permission.ACCESS_FINE_LOCATION,
                Manifest.permission.ACCESS_COARSE_LOCATION},0);

        //맵 플레그 먼트 선언
        mapFragment = (SupportMapFragment)getSupportFragmentManager().findFragmentById(R.id.map);

        // 맵
        mapFragment.getMapAsync(new OnMapReadyCallback() {
            @Override
            public void onMapReady(@NonNull GoogleMap googleMap) {
                map = googleMap;
                map.setMapType(GoogleMap.MAP_TYPE_NORMAL);
            }
        });

            MapsInitializer.initialize(this);
            startLocation();



        }

    public void startLocation() {

        long time =  100000;
        float distance = 0;

        LocationManager manager = (LocationManager)getSystemService(LOCATION_SERVICE);
        try{
            //마지막 로케이션 확인하기
            Location location = manager.getLastKnownLocation(LocationManager.GPS_PROVIDER);

            GPSListener gpsListener = new GPSListener();
            manager.requestLocationUpdates(LocationManager.GPS_PROVIDER,time,distance,gpsListener);
            manager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER,time,distance,gpsListener);

        }catch (SecurityException e){

        }

    }

    class GPSListener implements LocationListener {

        @Override
        public void onLocationChanged(@NonNull Location location) {
            latitude = location.getLatitude();
            longitude = location.getLongitude();
            showCurrentLocation(latitude,longitude);
        }

        @Override
        public void onStatusChanged(String provider, int status, Bundle extras) {

        }

        @Override
        public void onProviderEnabled(@NonNull String provider) {

        }

        @Override
        public void onProviderDisabled(@NonNull String provider) {

        }
    }

    public void showCurrentLocation(double latitude, double longitude){
        LatLng curPoint = new LatLng(latitude, longitude);
        //낼 물어보자 
        map.animateCamera(CameraUpdateFactory.newLatLngZoom(curPoint,15));
        try{
            // map.setMyLocationEnabled(true);
        }catch (SecurityException e){

        }

        showAllItem(35.833563749767706, 127.137976284438,R.drawable.school, "백제" , "직업전문학교");


    }

    private void showAllItem(double latitude, double longitude, int id, String title , String snippet){
        //맵위에 마커를 찍어서 나만의 표식 남겨주기

        MarkerOptions marker = new MarkerOptions();
        //마커찍을곳 위치 좌표
        marker.position(new LatLng(latitude, longitude));
        //큰제목
        marker.title(title);
        //작은 내용
        marker.snippet(snippet);
        //
        marker.draggable(true);
        //아이콘
        marker.icon(BitmapDescriptorFactory.fromResource(id));
        //맵에 마크 찍어주기
         map.addMarker(marker);
    }

    //메뉴 만들어줌
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        menu.add(0,1,0,"위성지도");
        menu.add(0,2,0,"일반지도");
        menu.add(0,3,0,"주소 검색창으로 이동");
        return true;
    }
    //메뉴 눌럿을때 기능
    @Override
    public boolean onOptionsItemSelected(@NonNull MenuItem item) {
        switch (item.getItemId()){
            case 1 :
                //맵 타입을 위성사진으로
                map.setMapType(GoogleMap.MAP_TYPE_SATELLITE);
                showCurrentLocation(latitude,longitude);
                break;
            case 2 :
                //맵 타입을 기본설정을
                map.setMapType(GoogleMap.MAP_TYPE_NORMAL);
                showCurrentLocation(latitude,longitude);
                break;
            case 3 :
                //메뉴 3번눌럿을때 검색을 위한 액티비티로 이동
                Intent intent = new Intent(getApplicationContext(),GeoCodingActivity.class);
                startActivityForResult(intent,1000);
                break;
        }
        return true;
    }

    @Override //GeoCodingActivity 받아온 값 으로 메인에서 처리해줌 자세한건 GeoCodingActivity확인
    protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if (requestCode== 1000 && resultCode==RESULT_OK){
            latitude = data.getDoubleExtra("latitude",0);
            longitude = data.getDoubleExtra("longitude",0);
            showCurrentLocation(latitude,longitude);
            Toast.makeText(getApplicationContext(),"검색완ㄹ료ㅛ료룔",Toast.LENGTH_SHORT).show();
        }else {
            Toast.makeText(getApplicationContext(),"검색취소소소",Toast.LENGTH_SHORT).show();
        }

    }
}

 

지오코딩 부분 

public class GeoCodingActivity extends AppCompatActivity {

    EditText edt_Address , edt_Lat, edt_Lng;
    double latitude, longitude;
    Geocoder gc;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_geo_coding);
        //go코더를 통해서 한글로 된 글자도 찾을수 있도록 해준다 .
        gc = new Geocoder(this, Locale.KOREAN);
        edt_Address = findViewById(R.id.editText);
        edt_Lat = findViewById(R.id.editText2);
        edt_Lng = findViewById(R.id.editText3);

        Button btn_address = findViewById(R.id.button2);
        Button btn_LatLng = findViewById(R.id.button3);

        btn_address.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                searchLocation(edt_Address.getText().toString());
            }
        });

        btn_LatLng.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                latitude =Double.parseDouble(edt_Lat.getText().toString());
                longitude =Double.parseDouble(edt_Lng.getText().toString());
                searchLocation(latitude,longitude);
            }
        });

    }

    public void searchLocation(String str){
        
        List<Address> addressList = null;
        
        try {
            //여기서 리스트로 만들어주는 이유는 만약 검색창에 
            // 전주를 검색했다고 치면 전주와 관련된것들이 여러개 나올것이다. 
            //그때 그 어려개를 담아주기 위함이고 (즉 str은 내가 입력한 글자 ) 
            //maxResults 는 검색했을때 상위 몇개 까지 가지고 올것인지 확인하는 것이다.
            addressList = gc.getFromLocationName(str,1);
            //일단 가져왔다면 널이 아니니까 아래 실행 
            if(addressList!=null){
                for(int i=0;i<addressList.size();i++){
                    Address address = addressList.get(i);
                    latitude = address.getLatitude();
                    longitude = address.getLongitude();
                }
                // 검색으로 알게된 위도와 경도를 인텐트로 다시 보내준다 .
                Intent intent = getIntent();
                intent.putExtra("latitude" , latitude);
                intent.putExtra("longitude" , longitude);

                setResult(RESULT_OK,intent);
                finish();

            }

        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public void searchLocation(double latitude, double longitude){
        Intent intent = getIntent();
        intent.putExtra("latitude" , latitude);
        intent.putExtra("longitude" , longitude);
        setResult(RESULT_OK,intent);
        finish();
    }
}

 

 

반응형