반응형
위치 기반서비스로 나의 현재 위치 알아내기
현재 나의 위치 정보를 알아야 구글 지도를 활용할수 있다.
코드를 보고 일단 나의 위치 정보 확인하는 것 부터 시작하자
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();
}
}
반응형
'아옳옳의 코딩공부 > 아옳옳의 안드로이드스튜디오' 카테고리의 다른 글
2021-06-14안드로이드 스튜디오 (멀티미디어 오디오녹음 저장) (0) | 2021.06.14 |
---|---|
2021-06-10안드로이드 스튜디오 (멀티미디어 이용하기) (0) | 2021.06.10 |
2021-06-06안드로이드 스튜디오 (파이어베이스 연동) (0) | 2021.06.07 |
2021-06-06안드로이드 스튜디오 (SQLite 사용하기 2) (0) | 2021.06.07 |
2021-06-03안드로이드 스튜디오 (SQLite 사용하기) (0) | 2021.06.03 |