현재 안드로이드 개발공부에 심취중이다. 현재 간단한 개인프로젝트를 진행중인데 내 현재 위치를 지도상에 나타내는 소스가 필요하여 이것처것 찾다가 수시간의 시행착오끝에 다음과 같은 소스를 산출해냈다.
[MainActivity.java]
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 | package org.techtown.myLocation; import androidx.annotation.NonNull; import androidx.appcompat.app.AppCompatActivity; import androidx.core.content.ContextCompat; import android.Manifest; import android.content.Context; import android.content.pm.PackageManager; import android.location.Location; import android.location.LocationListener; import android.location.LocationManager; import android.os.Bundle; import android.util.Log; import android.view.View; import android.widget.Button; import android.widget.TextView; import android.widget.Toast; import com.google.android.gms.maps.CameraUpdate; import com.google.android.gms.maps.CameraUpdateFactory; import com.google.android.gms.maps.GoogleMap; import com.google.android.gms.maps.MapsInitializer; import com.google.android.gms.maps.OnMapReadyCallback; import com.google.android.gms.maps.SupportMapFragment; import com.google.android.gms.maps.model.BitmapDescriptorFactory; import com.google.android.gms.maps.model.LatLng; import com.google.android.gms.maps.model.Marker; import com.google.android.gms.maps.model.MarkerOptions; import com.pedro.library.AutoPermissions; import com.pedro.library.AutoPermissionsListener; public class MainActivity extends AppCompatActivity implements AutoPermissionsListener { TextView textView; SupportMapFragment mapFragment; GoogleMap map; private Marker currentMarker = null; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); textView = findViewById(R.id.textView); mapFragment = (SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.map); mapFragment.getMapAsync(new OnMapReadyCallback() { @Override public void onMapReady(GoogleMap googleMap) { map = googleMap; startLocationService(); } }); try { MapsInitializer.initialize(this); } catch (Exception e) { e.printStackTrace(); } AutoPermissions.Companion.loadAllPermissions(this, 100); } private void setDefaultLocation() { //디폴트 위치, Seoul LatLng DEFAULT_LOCATION = new LatLng(37.56, 126.97); String markerTitle = "위치정보 가져올 수 없음"; String markerSnippet = "위치 퍼미션과 GPS 활성 요부 확인하세요"; if (currentMarker != null) currentMarker.remove(); MarkerOptions markerOptions = new MarkerOptions(); markerOptions.position(DEFAULT_LOCATION); markerOptions.title(markerTitle); markerOptions.snippet(markerSnippet); markerOptions.draggable(true); markerOptions.icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_RED)); currentMarker = map.addMarker(markerOptions); CameraUpdate cameraUpdate = CameraUpdateFactory.newLatLngZoom(DEFAULT_LOCATION, 15); map.moveCamera(cameraUpdate); } private void startLocationService() { LocationManager manager = (LocationManager) getSystemService(Context.LOCATION_SERVICE); try { int chk1 = ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION); int chk2 = ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION); Location location = null; if (chk1 == PackageManager.PERMISSION_GRANTED && chk2 == PackageManager.PERMISSION_GRANTED) { location = manager.getLastKnownLocation(LocationManager.GPS_PROVIDER); } else { return; } if (location != null) { double latitude = location.getLatitude(); double longitude = location.getLongitude(); String msg = "최근 위치 -> Latitue : " + latitude + "\nLongitude : " + longitude; showCurrentLocation(latitude, longitude); textView.setText(msg); } GPSListener gpsListener = new GPSListener(); long minTime = 10000; float minDistance = 0; manager.requestLocationUpdates(LocationManager.GPS_PROVIDER, minTime, minDistance, gpsListener); } catch ( Exception e) { e.printStackTrace(); } } class GPSListener implements LocationListener { @Override public void onLocationChanged(Location location) { Double latitude = location.getLatitude(); Double longitude = location.getLongitude(); String message = "내 위치 -> Latitude : " + latitude + "\nLongitude:" + longitude; Log.d("Map", message); showCurrentLocation(latitude, longitude); } @Override public void onStatusChanged(String provider, int status, Bundle extras) { } @Override public void onProviderEnabled(String provider) { } @Override public void onProviderDisabled(String provider) { } } private void showCurrentLocation(Double latitude, Double longitude) { LatLng curPoint = new LatLng(latitude, longitude); map.animateCamera(CameraUpdateFactory.newLatLngZoom(curPoint, 15)); //디폴트 위치, Seoul Toast.makeText(getApplicationContext(), "실행", Toast.LENGTH_LONG).show(); String markerTitle = "내위치"; String markerSnippet = "위치정보가 확인되었습니다."; if (currentMarker != null) currentMarker.remove(); MarkerOptions markerOptions = new MarkerOptions(); markerOptions.position(curPoint); markerOptions.title(markerTitle); markerOptions.snippet(markerSnippet); markerOptions.draggable(true); markerOptions.icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_RED)); currentMarker = map.addMarker(markerOptions); CameraUpdate cameraUpdate = CameraUpdateFactory.newLatLngZoom(curPoint, 15); map.moveCamera(cameraUpdate); } @Override public void onDenied(int i, String[] strings) { } @Override public void onGranted(int i, String[] strings) { Toast.makeText(this, "permissions granted : " + strings.length, Toast.LENGTH_LONG).show(); } @Override public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { super.onRequestPermissionsResult(requestCode, permissions, grantResults); AutoPermissions.Companion.parsePermissions(this, requestCode, permissions, this); } } | cs |
위의 ActivityMain.xml에서 예제소스를 그대로 써도 내위치를 나타내지 않고 있었는데 그 이유는 CameraUpdate나 Marking해주는 소스가 빠져있었기 때문이었다. 그래서 해당 소스를 추가해 주었다.
[android_main.xml]
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" tools:context=".MainActivity"> <TextView android:id="@+id/textView" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="TextView" /> <fragment android:id="@+id/map" android:layout_width="match_parent" android:layout_height="match_parent" class="com.google.android.gms.maps.SupportMapFragment"/> </LinearLayout> | cs |
[manifest.xml]
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 | <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="org.techtown.myLocation"> <permission android:name="org.techtown.location.permission.MAPS_RECEIVE" android:protectionLevel="signature" /> <uses-permission android:name="org.techtown.location.permission.MAPS_RECEIVE" /> <uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="com.google.android.providers.gsf.permission.READ_GSERVICES" /> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <uses-feature android:glEsVersion="0x00020000" android:required="true"/> <application android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:roundIcon="@mipmap/ic_launcher_round" android:supportsRtl="true" android:theme="@style/AppTheme"> <meta-data android:name="com.google.android.maps.v2.API_KEY" android:value="[개인 API KEY]"/> <activity android:name=".MainActivity"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> </manifest> | cs |
담배피러 아파트를 나섰을때 정확히 내 위치정보가 갱신되는 것을 확인하였을 때의 쾌감이란 이루 말할 수 없다.
요즘에서야 학생시절 느꼈던 개발의 즐거움을 다시나마 느끼고 있는 중이다.
학교를 졸업하고나서 회사에 다니면서 여러가지 회의감이 들었는데 그 이유는 인생의 목적을 돈에 두고 있었기 떄문이라고 생각한다.
그러던 차에 군시절 쓴 수양록에 쓴 내 꿈 최고의 프로그래머 라는 것을 보고 퇴사를 하고 이렇게 돈도 못 버는 백수가 되어있지만
꿈을향해 나아가고 있다는 확신이 들기에 하루하루가 어느때 보다 즐겁다.
'IT > 안드로이드' 카테고리의 다른 글
안드로이드 Volley 사용시 한글 깨짐현상 해결 (4) | 2019.10.29 |
---|---|
나의 첫 안드로이드 어플이 출시되다.(출시 대기중) (0) | 2019.10.19 |
구글 테스트 아이디를 이용한 안드로이드 애드몹 적용하기 (0) | 2019.10.11 |
안드로이드 에뮬레이터 용량문제(에뮬레이터 초기화) (0) | 2019.10.11 |
안드로이드 권한설정 관련 라이브러리 (0) | 2019.10.11 |