AndroidStudio 에서 JAVA 로 GPS 현재 위치 확인하기
프로그래밍/Android (Java)2024. 11. 1. 18:47
반응형
[출처] https://mainia.tistory.com/1153
출처에서 activity_main.xml 파일 내용만 추가하여 테스트하였고 정상 동작 확인하였습니다.
1. AndroidManifest.xml
... </uses-permission android:name="android.permission.internet" > </uses-permission android:name="android.permission.access_fine_location" > </uses-permission android:name="android.permission.access_coarse_location"> ... |
2. MainActivity.java
package kr.sysdocu.position; import android.Manifest; import android.app.Activity; import android.content.pm.PackageManager; import android.os.Build; import android.os.Bundle; import android.view.View; import android.widget.Button; import android.widget.TextView; import android.widget.Toast; /** GPS 샘플 */ public class MainActivity extends Activity { private Button btnShowLocation; private TextView txtLat; private TextView txtLon; private final int PERMISSIONS_ACCESS_FINE_LOCATION = 1000; private final int PERMISSIONS_ACCESS_COARSE_LOCATION = 1001; private boolean isAccessFineLocation = false; private boolean isAccessCoarseLocation = false; private boolean isPermission = false; // GPSTracker class private GpsInfo gps; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); btnShowLocation = (Button) findViewById(R.id.btn_start); txtLat = (TextView) findViewById(R.id.tv_latitude); txtLon = (TextView) findViewById(R.id.tv_longitude); // GPS 정보를 보여주기 위한 이벤트 클래스 등록 btnShowLocation.setOnClickListener(new View.OnClickListener() { public void onClick(View arg0) { // 권한 요청을 해야 함 if (!isPermission) { callPermission(); return; } gps = new GpsInfo(MainActivity.this); // GPS 사용유무 가져오기 if (gps.isGetLocation()) { double latitude = gps.getLatitude(); double longitude = gps.getLongitude(); txtLat.setText(String.valueOf(latitude)); txtLon.setText(String.valueOf(longitude)); Toast.makeText( getApplicationContext(), "당신의 위치 - \n위도: " + latitude + "\n경도: " + longitude, Toast.LENGTH_LONG).show(); } else { // GPS 를 사용할수 없으므로 gps.showSettingsAlert(); } } }); callPermission(); // 권한 요청을 해야 함 } @Override public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) { if (requestCode == PERMISSIONS_ACCESS_FINE_LOCATION && grantResults[0] == PackageManager.PERMISSION_GRANTED) { isAccessFineLocation = true; } else if (requestCode == PERMISSIONS_ACCESS_COARSE_LOCATION && grantResults[0] == PackageManager.PERMISSION_GRANTED){ isAccessCoarseLocation = true; } if (isAccessFineLocation && isAccessCoarseLocation) { isPermission = true; } } // 전화번호 권한 요청 private void callPermission() { // Check the SDK version and whether the permission is already granted or not. if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M && checkSelfPermission(Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) { requestPermissions( new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, PERMISSIONS_ACCESS_FINE_LOCATION); } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M && checkSelfPermission(Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED){ requestPermissions( new String[]{Manifest.permission.ACCESS_COARSE_LOCATION}, PERMISSIONS_ACCESS_COARSE_LOCATION); } else { isPermission = true; } } } |
3. activity_main.xml
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" android:padding="16dp"> <!-- 시작 버튼 --> <Button android:id="@+id/btn_start" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="위치 가져오기" /> <!-- 위도 표시 --> <TextView android:id="@+id/tv_latitude" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="위도: " android:textSize="18sp" android:paddingTop="20dp" /> <!-- 경도 표시 --> <TextView android:id="@+id/tv_longitude" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="경도: " android:textSize="18sp" android:paddingTop="10dp" /> </LinearLayout> |
4. GpsInfo.java
package kr.sysdocu.test; import android.annotation.TargetApi; import android.app.AlertDialog; import android.app.Service; import android.content.Context; import android.content.DialogInterface; import android.content.Intent; import android.content.pm.PackageManager; import android.location.Location; import android.location.LocationListener; import android.location.LocationManager; import android.os.Build; import android.os.Bundle; import android.os.IBinder; import android.provider.Settings; import androidx.core.content.ContextCompat; public class GpsInfo extends Service implements LocationListener { private final Context mContext; // 현재 GPS 사용유무 boolean isGPSEnabled = false; // 네트워크 사용유무 boolean isNetworkEnabled = false; // GPS 상태값 boolean isGetLocation = false; Location location; double lat; // 위도 double lon; // 경도 // 최소 GPS 정보 업데이트 거리 10미터 private static final long MIN_DISTANCE_CHANGE_FOR_UPDATES = 10; // 최소 GPS 정보 업데이트 시간 밀리세컨이므로 1분 private static final long MIN_TIME_BW_UPDATES = 1000 * 60 * 1; protected LocationManager locationManager; public GpsInfo(Context context) { this.mContext = context; getLocation(); } @TargetApi(23) public Location getLocation() { if ( Build.VERSION.SDK_INT >= 23 && ContextCompat.checkSelfPermission( mContext, android.Manifest.permission.ACCESS_FINE_LOCATION ) != PackageManager.PERMISSION_GRANTED && ContextCompat.checkSelfPermission( mContext, android.Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) { return null; } try { locationManager = (LocationManager) mContext .getSystemService(LOCATION_SERVICE); // GPS 정보 가져오기 isGPSEnabled = locationManager .isProviderEnabled(LocationManager.GPS_PROVIDER); // 현재 네트워크 상태 값 알아오기 isNetworkEnabled = locationManager .isProviderEnabled(LocationManager.NETWORK_PROVIDER); if (!isGPSEnabled && !isNetworkEnabled) { // GPS 와 네트워크사용이 가능하지 않을때 소스 구현 } else { this.isGetLocation = true; // 네트워크 정보로 부터 위치값 가져오기 if (isNetworkEnabled) { locationManager.requestLocationUpdates( LocationManager.NETWORK_PROVIDER, MIN_TIME_BW_UPDATES, MIN_DISTANCE_CHANGE_FOR_UPDATES, this); if (locationManager != null) { location = locationManager .getLastKnownLocation(LocationManager.NETWORK_PROVIDER); if (location != null) { // 위도 경도 저장 lat = location.getLatitude(); lon = location.getLongitude(); } } } if (isGPSEnabled) { if (location == null) { locationManager.requestLocationUpdates( LocationManager.GPS_PROVIDER, MIN_TIME_BW_UPDATES, MIN_DISTANCE_CHANGE_FOR_UPDATES, this); if (locationManager != null) { location = locationManager .getLastKnownLocation(LocationManager.GPS_PROVIDER); if (location != null) { lat = location.getLatitude(); lon = location.getLongitude(); } } } } } } catch (Exception e) { e.printStackTrace(); } return location; } /** * GPS 종료 * */ public void stopUsingGPS(){ if(locationManager != null){ locationManager.removeUpdates(GpsInfo.this); } } /** * 위도값을 가져옵니다. * */ public double getLatitude(){ if(location != null){ lat = location.getLatitude(); } return lat; } /** * 경도값을 가져옵니다. * */ public double getLongitude(){ if(location != null){ lon = location.getLongitude(); } return lon; } /** * GPS 나 wife 정보가 켜져있는지 확인합니다. * */ public boolean isGetLocation() { return this.isGetLocation; } /** * GPS 정보를 가져오지 못했을때 * 설정값으로 갈지 물어보는 alert 창 * */ public void showSettingsAlert(){ AlertDialog.Builder alertDialog = new AlertDialog.Builder(mContext); alertDialog.setTitle("GPS 사용유무셋팅"); alertDialog.setMessage("GPS 셋팅이 되지 않았을수도 있습니다. \n 설정창으로 가시겠습니까?"); // OK 를 누르게 되면 설정창으로 이동합니다. alertDialog.setPositiveButton("Settings", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog,int which) { Intent intent = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS); mContext.startActivity(intent); } }); // Cancle 하면 종료 합니다. alertDialog.setNegativeButton("Cancel", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int which) { dialog.cancel(); } }); alertDialog.show(); } @Override public IBinder onBind(Intent arg0) { return null; } public void onLocationChanged(Location location) { // TODO Auto-generated method stub } public void onStatusChanged(String provider, int status, Bundle extras) { // TODO Auto-generated method stub } public void onProviderEnabled(String provider) { // TODO Auto-generated method stub } public void onProviderDisabled(String provider) { // TODO Auto-generated method stub } } |
반응형
'프로그래밍 > Android (Java)' 카테고리의 다른 글
안드로이드 java 에서 웹페이지 출력 내용을 String 에 넣기 (0) | 2024.11.30 |
---|---|
[Android] APNG 사용하기 (0) | 2023.08.24 |
FCM 을 활용한 PUSH 메세지 보내기 (2024-11-23) (0) | 2022.10.19 |
안드로이드 알람 생성 2가지 방법 (Android Notifications Tutorial with Examples) (0) | 2022.07.18 |
안드로이드 비정상 종료 감지 처리 (어플 재시작) (0) | 2021.06.08 |
댓글()