본문 바로가기
개발/안드로이드

[안드로이드] 현재 위치(좌표) 구하기 | 버그리포트

by 핸디(Handy) 2019. 10. 10.

버그 사항 : 현재 위치가 찾아지지 않은 상태에서 내위치 정보 요청 -> Nullpointnullpointerexception 발생

수정 : 내 위치를 찾을때까지 위치 요청 반복 + GPS외에 Network로 좌표요청 추가 + 위치 변경 기준 10m& 1초 

  //현재 위치를 찾을때까지 0.5초마다 요청
        final Handler my_location_handler=new Handler();
        final LocationManager lm = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
        final TextView start_place_2=findViewById(R.id.start_place_2);
        TextView finish_place_2=findViewById(R.id.finish_place_2);
        my_location_handler.postDelayed(new Runnable() {
            @Override
            public void run() {
                //권한 및 버젼 확인
                if (Build.VERSION.SDK_INT >= 23 &&
                        ContextCompat.checkSelfPermission(getApplicationContext(), Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
                    ActivityCompat.requestPermissions(Main2Activity.this, new String[]{Manifest.permission.ACCESS_FINE_LOCATION},
                            0);
                } else {
                    Log.d("current_location", "현재 위치 찾기 시작");
                    Location location = lm.getLastKnownLocation(LocationManager.GPS_PROVIDER);

                    if(location==null){
                        //gps를 이용한 좌표조회 실패시 network로 위치 조회
                        location = lm.getLastKnownLocation(LocationManager.NETWORK_PROVIDER);
                    }
                    if(location!=null) {
                        String provider = location.getProvider();
                        double longitude = location.getLongitude();
                        double latitude = location.getLatitude();
                        double altitude = location.getAltitude();
                        current_location_name = getAddress(Main2Activity.this.getBaseContext(), latitude, longitude)
                                .replace("대한민국","")
                                .replace("서울특별시","서울시"); // 이 부분은 좌표 -> 주소로 하게되면 대한민국부터 시작하는 걸 없애기 위함
                        if(route_start_place_name.length()>1){

                        }else{
                            start_place_2.setText(current_location_name);
                        }
                        lm.requestLocationUpdates(LocationManager.GPS_PROVIDER,
                                1000,
                                10,
                                gpsLocationListener);
                        lm.requestLocationUpdates(LocationManager.NETWORK_PROVIDER,
                                1000,
                                10,
                                gpsLocationListener);

                        Log.d("current_location", current_location_name);
                    }else {
                        Log.d("current_location", "현재 위치 찾기 실패");
                        //위치 찾기에 실패하였기 때문에 0.5초 뒤에 다시 위치 찾는 메소드 실행
                        my_location_handler.postDelayed(this,500);
                    }
                }
            }
        },500);

 

<메소드설명> getAddress : 위도,경도로 이루어진 좌표정보를 지번 주소로 변환하주는 메소드

    static public String getAddress(Context mContext, double lat, double lng) {
        String nowAddress = "현 위치를 찾고 있습니다";
        Geocoder geocoder = new Geocoder(mContext, Locale.KOREA);
        List<Address> address;
        try {
            //세번째 파라미터는 좌표에 대해 주소를 리턴 받는 갯수로
            //한좌표에 대해 두개이상의 이름이 존재할수있기에 주소배열을 리턴받기 위해 최대갯수 설정
            address = geocoder.getFromLocation(lat, lng, 1);

            if (address != null && address.size() > 0) {
                // 주소 받아오기
                nowAddress = address.get(0).getAddressLine(0);

            }

        } catch (IOException e) {
            //Toast.makeText(MainActivity.this, "잘못된 포인트 설정입니다.", Toast.LENGTH_SHORT).show();
            e.printStackTrace();
        }
        return nowAddress;
    }

 

<메소드설명> gpsLocationListnener : 좌표정보가 갱신되었을때 잡아내는 Listener

   final LocationListener gpsLocationListener = new LocationListener() {
        public void onLocationChanged(Location location) {

            String provider = location.getProvider();
            double longitude = location.getLongitude();
            double latitude = location.getLatitude();
            double altitude = location.getAltitude();

            current_location_latitude=latitude;
            current_location_longitude=longitude;

            current_location_name = getAddress(Main2Activity.this.getBaseContext(), latitude, longitude).replace("대한민국","").replace("서울특별시","서울시");
            TextView start_place_2=findViewById(R.id.start_place_2);
            if(route_start_place_name.length()<1){
                start_place_2.setText(current_location_name);
            }
        }

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

        public void onProviderEnabled(String provider) {
        }

        public void onProviderDisabled(String provider) {
        }
    };

현재 위치 정보를 바로 보여줌

 

댓글