일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- #안드로이드 #안드로이드 앱 프로그래밍 #모바일 개발자
- 안드로이드 앱개발.
- 안드로이드 스튜디오
- #안드로이드 앱프로그래밍
- 안드로이드
- 안드로이드 #데이터베이스 #안드로이드 앱프로그래밍
- #안드로이드 프로그래밍
- #안드로이드 #안드로이드 앱프로그래밍 #모바일 개발 #키패드 제어하기
- 마스크 효과 #안드로이드 프로그래밍
- #안드로이드 스튜디오 #안드로이드 앱개발 #안드로이드 카드뷰
- Today
- Total
모바일 개발을 잘하고 싶은 안드로이드 앱개발자
GPS로 나의 위치 확인하기 본문
activity_main.xml
<androidx.constraintlayout.widget.ConstraintLayout 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"
tools:context=".MainActivity">
<TextView
android:id="@+id/textView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="내 위치"
android:textSize="30sp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<Button
android:id="@+id/button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="8dp"
android:layout_marginBottom="8dp"
android:text="내 위치 확인하기"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/textView" />
</androidx.constraintlayout.widget.ConstraintLayout>
프로젝트 창이 열리면 activity_main.xml파일을 열고 텍스트뷰 하나와 버튼 하나를 추가합니다 그러고 나서 버튼에는 '내 위치 확인하기'라는 글자가 표시되도록 합니다.버튼을 누르면 내 위치 확인을 시작하도록 하고 위치가 확인되면 텍스트뷰에 보여 줍니다
MainActivity.java
package org.techtown.location;
import android.content.Context;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;
import androidx.appcompat.app.AppCompatActivity;
import com.yanzhenjie.permission.Action;
import com.yanzhenjie.permission.AndPermission;
import com.yanzhenjie.permission.runtime.Permission;
import org.techtown.location.R;
import java.util.List;
public class MainActivity extends AppCompatActivity {
TextView textView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
textView = findViewById(R.id.textView);
Button button = findViewById(R.id.button);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
startLocationService();
}
});
AndPermission.with(this)
.runtime()
.permission(
Permission.ACCESS_FINE_LOCATION,
Permission.ACCESS_COARSE_LOCATION)
.onGranted(new Action<List<String>>() {
@Override
public void onAction(List<String> permissions) {
showToast("허용된 권한 갯수 : " + permissions.size());
}
})
.onDenied(new Action<List<String>>() {
@Override
public void onAction(List<String> permissions) {
showToast("거부된 권한 갯수 : " + permissions.size());
}
})
.start();
}
public void showToast(String message) {
Toast.makeText(this, message, Toast.LENGTH_LONG).show();
}
public void startLocationService() {
LocationManager manager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
try {
Location location = manager.getLastKnownLocation(LocationManager.GPS_PROVIDER);
if (location != null) {
double latitude = location.getLatitude();
double longitude = location.getLongitude();
String message = "최근 위치 -> Latitude : " + latitude + "\nLongitude:" + longitude;
textView.setText(message);
}
GPSListener gpsListener = new GPSListener();
long minTime = 10000;
float minDistance = 0;
manager.requestLocationUpdates(
LocationManager.GPS_PROVIDER,
minTime, minDistance, gpsListener);
Toast.makeText(getApplicationContext(), "내 위치확인 요청함",
Toast.LENGTH_SHORT).show();
} catch(SecurityException e) {
e.printStackTrace();
}
}
class GPSListener implements LocationListener {
public void onLocationChanged(Location location) {
Double latitude = location.getLatitude();
Double longitude = location.getLongitude();
String message = "내 위치 -> Latitude : "+ latitude + "\nLongitude:"+ longitude;
textView.setText(message);
}
public void onProviderDisabled(String provider) { }
public void onProviderEnabled(String provider) { }
public void onStatusChanged(String provider, int status, Bundle extras) { }
}
}
1단계-위치 관리자 객체 참조하기
위치 관리자는 시스템 서비스이므로 객체를 참조하기 위해서 getSystemService메서드를 사용합니다.MainActivity.java파일을 열고 버튼을 클릭했을 떄 startLocationService메서드가 호출되도록 합니다.위치 관리자를 위해 정의한 상수의 이름은 Context.LOCATION_SERVICE입니다.최근 위치 정보를 확인하기 위해 사용하는 getLastKnownLocation 메서드에는 위치 정보를 제공하는 위치 제공자(Location Provider)정보를 파라미터로 전달합니다.안드로이드는 위치 제공자를 크게 GPS_PROVIDER와NETWORK_PROVIDER로 구분하고 있으며,두 개의 값 중 하나를 파라미터로 전달하면 됩니다.실제 앱에서는 대부분GPS를 이용하게 되므로GSP_PROVIDER를 전달하면 Location객체가 반환됩니다.Location객체는 위도와 경도 값을 가지고있으며, getLatitude와getLongitude메서드로 값을 확인할 수 있습니다.
2단계-위치 리스너 구현하기
위치 리스너(LocationListener)는 위치 관리자에서 전달하는 위치 정보를 박시 위해 정의된 인터페이스입니다.위치 관리자가 위치 정보를 전달할 때 호출되므로 우치 정보를 받아 처리하려면 리스너의 onLocationChanger메서드를 구현해야 합니다.MainActivity클래스 안에 LocationListener인터페이스를 구현하는 내부 클래스를 정의합니다.위치 리스너에는 위치 제공자의 상태를 확인하는 메서드와 함꼐 위치 정보를 전달할 떄 호출되는 onLocationChanged메서드가 함꼐 정의되어 있습니다.
3단계-위치 정보 업데이트 요청하기
위치 관리자는 일정한 시간 간격으로 위치 정보를 확인하거나 일정 거리 이상을 이동했을 떄 위치 정보를 전달하는 기능을 제공합니다.위치 관리자에게 현재 위치를 알려달라고 요청하기 위해서는 requstLocationUpdates메서드를 호출해야 하는게 파라미터로는 최소 시간과 최소 거리 그리고 위치 리스너 객제가 전달되어야 합니다.startLocationServce 메서드를 수정합니다..startLocationServce메서드는 위치 정보를 수신을 시작하기 위해 만든 메서드 입니다. .startLocationServce 메서드 안에서 requestLocationUpdates메서드가 호출되는 것을 볼 수 있습니다.
4단계-위험 권한을 위한 코드 추가하기
GPS를 이용해 위치 정보를 받으려면 매니페스트에 권한을 추가했습니다.권한은 위험 권한으로 분류되어 있으므로 위험 권한을 부여하는 설정과 코드를 추가합니다.
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="org.techtown.location">
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
<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/Theme.SampleLocation">
<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>