버그 사항 : 현재 위치가 찾아지지 않은 상태에서 내위치 정보 요청 -> 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) {
}
};
'개발 > 안드로이드' 카테고리의 다른 글
[안드로이드] 구글맵 + 마커 클러스터링 + 커스텀 마커 + 마커 클릭 이벤트 구현 (2) | 2020.01.15 |
---|---|
[안드로이드]recycleview item의 특정 텍스트 색상 변경 (0) | 2019.10.15 |
[안드로이드] 공공데이터 api 파싱 예시 및 그래프 표현 (0) | 2019.08.15 |
[안드로이드] Glide를 이용하여 gif 파일을 dialog에서 실행하기 (0) | 2019.08.05 |
[안드로이드]fragment 내에서 키보드 조정하기(내리기) (0) | 2019.05.14 |
댓글