Android-위치 기반 서비스
Android 위치 API를 사용하면 기본 위치 기술의 세부 사항에 집중할 필요없이 위치 인식 애플리케이션을 쉽게 빌드 할 수 있습니다.
이것은 다음의 도움으로 가능해집니다. Google Play services, 자동 위치 추적, 지오 펜싱 및 활동 인식을 통해 앱에 위치 인식을 쉽게 추가 할 수 있습니다.
이 튜토리얼은 앱에서 위치 서비스를 사용하여 현재 위치를 가져오고,주기적인 위치 업데이트를 받고, 주소를 찾는 방법을 보여줍니다.
위치 개체
그만큼 Location객체는 위도, 경도, 타임 스탬프 및 방위, 고도 및 속도와 같은 기타 정보로 구성 될 수있는 지리적 위치를 나타냅니다. 위치 특정 정보를 얻기 위해 위치 객체와 함께 사용할 수있는 다음과 같은 중요한 방법이 있습니다.
Sr. 아니. | 방법 및 설명 |
---|---|
1 | float distanceTo(Location dest) 이 위치와 지정된 위치 사이의 대략적인 거리 (미터)를 반환합니다. |
2 | float getAccuracy() 이 위치의 예상 정확도를 미터 단위로 가져옵니다. |
삼 | double getAltitude() 가능한 경우 해발 미터 단위의 고도를 가져옵니다. |
4 | float getBearing() 각도로 베어링을 가져옵니다. |
5 | double getLatitude() 위도를 구하십시오. |
6 | double getLongitude() 경도를도 단위로 가져옵니다. |
7 | float getSpeed() 가능한 경우 지상에서 미터 / 초로 속도를 얻습니다. |
8 | boolean hasAccuracy() 이 위치가 정확하면 True입니다. |
9 | boolean hasAltitude() 이 위치에 고도가 있으면 True입니다. |
10 | boolean hasBearing() 이 위치에 방향 각이 있으면 참입니다. |
11 | boolean hasSpeed() 이 위치에 속도가 있으면 True입니다. |
12 | void reset() 위치의 내용을 지 웁니다. |
13 | void setAccuracy(float accuracy) 이 위치의 예상 정확도 (미터)를 설정합니다. |
14 | void setAltitude(double altitude) 해발 미터 단위로 고도를 설정합니다. |
15 | void setBearing(float bearing) 방위를 각도로 설정합니다. |
16 | void setLatitude(double latitude) 위도를도 단위로 설정합니다. |
17 | void setLongitude(double longitude) 경도를도 단위로 설정합니다. |
18 | void setSpeed(float speed) 지상에서 초당 미터 / 초로 속도를 설정합니다. |
19 | String toString() 이 객체에 대한 간결하고 사람이 읽을 수있는 설명이 포함 된 문자열을 반환합니다. |
현재 위치 얻기
현재 위치를 얻으려면 다음과 같은 위치 클라이언트를 만드십시오. LocationClient 개체를 사용하여 위치 서비스에 연결합니다. connect() 메서드를 호출 한 다음 getLastLocation()방법. 이 메서드는 다음 형식으로 가장 최근 위치를 반환합니다.Location위도 및 경도 좌표와 위에서 설명한 기타 정보를 포함하는 객체입니다. 활동에서 위치 기반 기능을 사용하려면 두 개의 인터페이스를 구현해야합니다.
- GooglePlayServicesClient.ConnectionCallbacks
- GooglePlayServicesClient.OnConnectionFailedListener
이 인터페이스는 활동 클래스에서 구현해야하는 다음과 같은 중요한 콜백 메소드를 제공합니다.
Sr. 아니. | 콜백 방법 및 설명 |
---|---|
1 | abstract void onConnected(Bundle connectionHint) 이 콜백 메서드는 위치 서비스가 위치 클라이언트에 성공적으로 연결되었을 때 호출됩니다. 당신은 사용할 것입니다connect() 위치 클라이언트에 연결하는 방법. |
2 | abstract void onDisconnected() 이 콜백 메서드는 클라이언트 연결이 끊어 질 때 호출됩니다. 당신은 사용할 것입니다disconnect() 위치 클라이언트에서 연결을 끊는 방법. |
삼 | abstract void onConnectionFailed(ConnectionResult result) 이 콜백 메서드는 클라이언트를 서비스에 연결하는 동안 오류가 발생했을 때 호출됩니다. |
위치 클라이언트를 만들어야합니다. onCreate() 당신의 활동 클래스의 메소드를 연결하고 onStart(), 위치 서비스는 활동이 완전히 표시되는 동안 현재 위치를 유지합니다. 클라이언트 연결을 해제해야합니다. onStop()메서드를 사용하므로 앱이 표시되지 않으면 위치 서비스가 현재 위치를 유지하지 않습니다. 이는 배터리 전력을 크게 절약하는 데 도움이됩니다.
업데이트 된 위치 얻기
위치 업데이트를 원하는 경우 위에서 언급 한 인터페이스와 별도로 다음을 구현해야합니다. LocationListener인터페이스도 있습니다. 이 인터페이스는 활동 클래스에서 구현해야하는 다음 콜백 메소드를 제공합니다.
Sr. 아니. | 콜백 방법 및 설명 |
---|---|
1 | abstract void onLocationChanged(Location location) 이 콜백 메서드는 위치가 변경된 경우 LocationClient에서 알림을 수신하는 데 사용됩니다. |
위치 서비스 품질
그만큼 LocationRequest 객체는 위치 업데이트를 위해 서비스 품질 (QoS)을 요청하는 데 사용됩니다. LocationClient. QoS를 처리하는 데 사용할 수있는 유용한 setter 방법은 다음과 같습니다. Android 공식 문서에서 확인할 수있는 동등한 getter 메서드가 있습니다.
Sr. 아니. | 방법 및 설명 |
---|---|
1 | setExpirationDuration(long millis) 이 요청의 기간을 밀리 초 단위로 설정합니다. |
2 | setExpirationTime(long millis) 부팅 이후 요청 만료 시간 (밀리 초)을 설정합니다. |
삼 | setFastestInterval(long millis) 위치 업데이트를위한 가장 빠른 간격 (밀리 초)을 명시 적으로 설정합니다. |
4 | setInterval(long millis) 원하는 활성 위치 업데이트 간격 (밀리 초)을 설정합니다. |
5 | setNumUpdates(int numUpdates) 위치 업데이트 횟수를 설정합니다. |
6 | setPriority(int priority) 요청의 우선 순위를 설정합니다. |
예를 들어 애플리케이션이 높은 정확도의 위치를 원하면 다음을 사용하여 위치 요청을 만들어야합니다. setPriority(int) PRIORITY_HIGH_ACCURACY로 설정하고 setInterval(long)5 초. 더 큰 간격 및 / 또는 "도시"수준 정확도를 요청하려면 PRIORITY_LOW_POWER와 같은 다른 우선 순위를 사용하고 "블록"수준 정확도를 위해 PRIORITY_BALANCED_POWER_ACCURACY를 사용할 수도 있습니다.
활동은 백그라운드에 들어갈 때 (예 : onPause ()에서) 모든 위치 요청을 제거하는 것을 강력히 고려하거나 최소한 요청을 더 큰 간격과 낮은 품질로 교체하여 전력 소비를 절약해야합니다.
위치 주소 표시
일단 당신이 Location 개체, 당신은 사용할 수 있습니다 Geocoder.getFromLocation()주어진 위도와 경도에 대한 주소를 얻는 방법. 이 메서드는 동기식이며 작업을 수행하는 데 시간이 오래 걸릴 수 있으므로 다음에서 메서드를 호출해야합니다.doInBackground() 방법 AsyncTask 수업.
그만큼 AsyncTask 사용하려면 하위 클래스로 분류되어야하며 하위 클래스는 doInBackground(Params...) 백그라운드에서 작업을 수행하는 방법 및 onPostExecute(Result)백그라운드 계산이 완료된 후 결과를 표시 할 때 UI 스레드에서 메서드가 호출됩니다. AyncTask에서 사용할 수있는 또 다른 중요한 방법이 있습니다.execute(Params... params),이 메서드는 지정된 매개 변수를 사용하여 작업을 실행합니다.
예
다음 예제는 앱에서 위치 서비스를 사용하여 현재 위치와 이에 상응하는 주소 등을 얻는 방법을 실제적으로 보여줍니다.
이 예제를 실험하려면 최신 Android OS가 장착 된 실제 모바일 장치가 필요합니다. 그렇지 않으면 작동하지 않을 수있는 에뮬레이터와 씨름해야합니다.
Android 애플리케이션 생성
단계 | 기술 |
---|---|
1 | Android 스튜디오 IDE를 사용하여 Android 애플리케이션을 만들고 com.example.tutorialspoint7.myapplication 패키지 아래에 Tutorialspoint 로 이름을 지정합니다 . |
2 | 추가 SRC / GPSTracker.java의 파일을 필요한 코드를 추가합니다. |
삼 | src / MainActivity.java 파일을 수정 하고 아래 그림과 같이 필요한 코드를 추가하여 현재 위치와 동등한 주소를 가져옵니다 . |
4 | 레이아웃 XML 파일 res / layout / activity_main.xml 을 수정 하여 위치 / 주소를 표시하는 3 개의 버튼과 2 개의 텍스트보기를 포함하는 모든 GUI 구성 요소를 추가하십시오. |
5 | res / values / strings.xml 을 수정 하여 필요한 상수 값을 정의합니다. |
6 | 아래와 같이 AndroidManifest.xml 을 수정 합니다. |
7 | 애플리케이션을 실행하여 Android 에뮬레이터를 시작하고 애플리케이션에서 수행 한 변경 결과를 확인합니다. |
다음은 수정 된 주요 활동 파일의 내용입니다. MainActivity.java.
package com.example.tutorialspoint7.myapplication;
import android.Manifest;
import android.app.Activity;
import android.os.Bundle;
import android.support.v4.app.ActivityCompat;
import android.test.mock.MockPackageManager;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;
public class MainActivity extends Activity {
Button btnShowLocation;
private static final int REQUEST_CODE_PERMISSION = 2;
String mPermission = Manifest.permission.ACCESS_FINE_LOCATION;
// GPSTracker class
GPSTracker gps;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
try {
if (ActivityCompat.checkSelfPermission(this, mPermission)
!= MockPackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(this, new String[]{mPermission},
REQUEST_CODE_PERMISSION);
// If any permission above not allowed by user, this condition will
execute every time, else your else part will work
}
} catch (Exception e) {
e.printStackTrace();
}
btnShowLocation = (Button) findViewById(R.id.button);
// show location button click event
btnShowLocation.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View arg0) {
// create class object
gps = new GPSTracker(MainActivity.this);
// check if GPS enabled
if(gps.canGetLocation()){
double latitude = gps.getLatitude();
double longitude = gps.getLongitude();
// \n is for new line
Toast.makeText(getApplicationContext(), "Your Location is - \nLat: "
+ latitude + "\nLong: " + longitude, Toast.LENGTH_LONG).show();
}else{
// can't get location
// GPS or Network is not enabled
// Ask user to enable GPS/network in settings
gps.showSettingsAlert();
}
}
});
}
}
다음은 수정 된 주요 활동 파일의 내용입니다. GPSTracker.java.
package com.example.tutorialspoint7.myapplication;
import android.app.AlertDialog;
import android.app.Service;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.Bundle;
import android.os.IBinder;
import android.provider.Settings;
import android.util.Log;
public class GPSTracker extends Service implements LocationListener {
private final Context mContext;
// flag for GPS status
boolean isGPSEnabled = false;
// flag for network status
boolean isNetworkEnabled = false;
// flag for GPS status
boolean canGetLocation = false;
Location location; // location
double latitude; // latitude
double longitude; // longitude
// The minimum distance to change Updates in meters
private static final long MIN_DISTANCE_CHANGE_FOR_UPDATES = 10; // 10 meters
// The minimum time between updates in milliseconds
private static final long MIN_TIME_BW_UPDATES = 1000 * 60 * 1; // 1 minute
// Declaring a Location Manager
protected LocationManager locationManager;
public GPSTracker(Context context) {
this.mContext = context;
getLocation();
}
public Location getLocation() {
try {
locationManager = (LocationManager) mContext.getSystemService(LOCATION_SERVICE);
// getting GPS status
isGPSEnabled = locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER);
// getting network status
isNetworkEnabled = locationManager
.isProviderEnabled(LocationManager.NETWORK_PROVIDER);
if (!isGPSEnabled && !isNetworkEnabled) {
// no network provider is enabled
} else {
this.canGetLocation = true;
// First get location from Network Provider
if (isNetworkEnabled) {
locationManager.requestLocationUpdates(
LocationManager.NETWORK_PROVIDER,
MIN_TIME_BW_UPDATES,
MIN_DISTANCE_CHANGE_FOR_UPDATES, this);
Log.d("Network", "Network");
if (locationManager != null) {
location = locationManager
.getLastKnownLocation(LocationManager.NETWORK_PROVIDER);
if (location != null) {
latitude = location.getLatitude();
longitude = location.getLongitude();
}
}
}
// if GPS Enabled get lat/long using GPS Services
if (isGPSEnabled) {
if (location == null) {
locationManager.requestLocationUpdates(
LocationManager.GPS_PROVIDER,
MIN_TIME_BW_UPDATES,
MIN_DISTANCE_CHANGE_FOR_UPDATES, this);
Log.d("GPS Enabled", "GPS Enabled");
if (locationManager != null) {
location = locationManager
.getLastKnownLocation(LocationManager.GPS_PROVIDER);
if (location != null) {
latitude = location.getLatitude();
longitude = location.getLongitude();
}
}
}
}
}
} catch (Exception e) {
e.printStackTrace();
}
return location;
}
/**
* Stop using GPS listener
* Calling this function will stop using GPS in your app
* */
public void stopUsingGPS(){
if(locationManager != null){
locationManager.removeUpdates(GPSTracker.this);
}
}
/**
* Function to get latitude
* */
public double getLatitude(){
if(location != null){
latitude = location.getLatitude();
}
// return latitude
return latitude;
}
/**
* Function to get longitude
* */
public double getLongitude(){
if(location != null){
longitude = location.getLongitude();
}
// return longitude
return longitude;
}
/**
* Function to check GPS/wifi enabled
* @return boolean
* */
public boolean canGetLocation() {
return this.canGetLocation;
}
/**
* Function to show settings alert dialog
* On pressing Settings button will lauch Settings Options
* */
public void showSettingsAlert(){
AlertDialog.Builder alertDialog = new AlertDialog.Builder(mContext);
// Setting Dialog Title
alertDialog.setTitle("GPS is settings");
// Setting Dialog Message
alertDialog.setMessage("GPS is not enabled. Do you want to go to settings menu?");
// On pressing Settings button
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);
}
});
// on pressing cancel button
alertDialog.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
dialog.cancel();
}
});
// Showing Alert Message
alertDialog.show();
}
@Override
public void onLocationChanged(Location location) {
}
@Override
public void onProviderDisabled(String provider) {
}
@Override
public void onProviderEnabled(String provider) {
}
@Override
public void onStatusChanged(String provider, int status, Bundle extras) {
}
@Override
public IBinder onBind(Intent arg0) {
return null;
}
}
다음 내용은 res/layout/activity_main.xml 파일-
<?xml version = "1.0" encoding = "utf-8"?>
<LinearLayout xmlns:android = "http://schemas.android.com/apk/res/android"
android:layout_width = "fill_parent"
android:layout_height = "fill_parent"
android:orientation = "vertical" >
<Button
android:id = "@+id/button"
android:layout_width = "fill_parent"
android:layout_height = "wrap_content"
android:text = "getlocation"/>
</LinearLayout>
다음 내용은 res/values/strings.xml 두 개의 새로운 상수를 정의하려면-
<?xml version = "1.0" encoding = "utf-8"?>
<resources>
<string name = "app_name">Tutorialspoint</string>
</resources>
다음은의 기본 콘텐츠입니다. AndroidManifest.xml −
<?xml version = "1.0" encoding = "utf-8"?>
<manifest xmlns:android = "http://schemas.android.com/apk/res/android"
package = "com.example.tutorialspoint7.myapplication">
<uses-permission android:name = "android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name = "android.permission.INTERNET" />
<application
android:allowBackup = "true"
android:icon = "@mipmap/ic_launcher"
android:label = "@string/app_name"
android:supportsRtl = "true"
android:theme = "@style/AppTheme">
<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>
당신의 Tutorialspoint신청. 실제 Android 모바일 장치를 컴퓨터에 연결했다고 가정합니다. Android Studio에서 앱을 실행하려면 프로젝트의 활동 파일 중 하나를 열고
이제 위치를 보려면 다음과 같이 위치 정보를 표시하는 Get Location 버튼을 선택하십시오.