Android 가 현재 위치의 위도 데 이 터 를 가 져 옵 니 다.
위치 도구 현재 위치 정보 가 져 오기
Android 핸드폰 에서 현재 위 치 를 가 져 오 는 방식:GPS 위치,WIFI 위치,기지 국 위치,현재 Demo 는 GPS 위성 위치 추적 을 사용 하여 Location Tool 에서 Location,Location Manager 두 대상 을 되 돌려 주 고 Location 에서 제공 하 는 getLatitude(),getLongitude()를 통 해 위도 데 이 터 를 읽 으 며 위치 변경 모니터 MyLocation Listener 를 추가 합 니 다.구체 적 인 코드 는 다음 과 같 습 니 다.
package cn.teachcourse.utils;
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.location.Criteria;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.Bundle;
import android.provider.Settings;
import android.widget.Toast;
/*
@author [email protected]
@date :2016-1-22
*/
public class LocationTool {
public Location getLocation() {
return mLocation;
}
public void setLocation(Location location) {
this.mLocation = location;
}
private Context context;
private Location mLocation;
private LocationManager mLocationManager;
public LocationTool(Context context) {
super();
mLocationManager = (LocationManager) context
.getSystemService(Context.LOCATION_SERVICE);
mLocation = mLocationManager.getLastKnownLocation(getProvider());
mLocationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER,
2000, 10, new MyLocationListener(this));
}
// Location Provider
private String getProvider() {
//
Criteria criteria = new Criteria();
// :
criteria.setAccuracy(Criteria.ACCURACY_FINE);
// :
criteria.setAltitudeRequired(false);
// :
criteria.setBearingRequired(false);
// :
criteria.setCostAllowed(true);
// :
criteria.setPowerRequirement(Criteria.POWER_LOW);
// provider, 2 true , provider , provider
return mLocationManager.getBestProvider(criteria, true);
}
public LocationManager getLocationManager() {
return mLocationManager;
}
private LocationListener mLocationListener = new LocationListener() {
@Override
public void onStatusChanged(String provider, int status, Bundle extras) {
// TODO Auto-generated method stub
}
@Override
public void onProviderEnabled(String provider) {
Location l = mLocationManager.getLastKnownLocation(provider);
if (l != null) {
mLocation = l;
}
}
@Override
public void onProviderDisabled(String provider) {
mLocation = null;
}
@Override
public void onLocationChanged(Location location) {
if (location != null) {
mLocation = location;
}
}
};
public void closeLocation() {
if (mLocationManager != null) {
if (mLocationManager != null) {
mLocationManager.removeUpdates(mLocationListener);
mLocationListener = null;
}
mLocationManager = null;
}
}
}
MyLocationListener 위치 변경 모니터LocationManager 대상 호출 requestLocationUpdates(String provider,long minTime,float minDistance,LocationListener listener),리 셋 방법 에서 변 경 된 Location 대상 을 가 져 옵 니 다.그 중에서 provider 는 LocationManager.GPSPROVIDER,minTime 은 최 단 시간 간격 으로 위치 정보(단위 밀리초)를 업데이트 하 는 것 을 나타 내 고,minDistance 는 최 단 거리 에서 위치 정보(단위 미터)를 업데이트 하 는 것 을 나타 내 며,MyLocationListener 는 위치 Listener 를 계승 하여 다시 쓰 는 방법 은 다음 과 같다.
package cn.teachcourse.utils;
import android.location.Location;
import android.location.LocationListener;
import android.os.Bundle;
/*
@author [email protected]
@date :2016-1-22
*/
public class MyLocationListener implements LocationListener {
private LocationTool gpsTool;
/** , LocationTool
* @param gpsTool
*/
public MyLocationListener(LocationTool gpsTool) {
super();
this.gpsTool = gpsTool;
}
/**
* , onLocationChanged , Location
*
*/
@Override
public void onLocationChanged(Location location) {
if (location != null) {
gpsTool.setLocation(location);
}
}
/**
* provider , provider provider
*
*/
@Override
public void onStatusChanged(String provider, int status, Bundle extras) {
// TODO Auto-generated method stub
}
/**
* provider , onProviderEnabled , : ,
*
*/
@Override
public void onProviderEnabled(String provider) {
Location l = gpsTool.getLocationManager()
.getLastKnownLocation(provider);
if (l != null) {
gpsTool.setLocation(l);
}
}
/**
* provider , onProviderDisabled , : ,
*
*/
@Override
public void onProviderDisabled(String provider) {
gpsTool.setLocation(null);
}
}
위치 서비스 위치 정보 읽 기서 비 스 를 왜 켜 요?Service 는 Activity,Fragment 와 마찬가지 로 자신의 생명 주기 가 있 습 니 다.onCreate―onStart Command(onStart)―>onUnbind―>onRebind―>onDestroy 는 Location Service 에서 실 행 된 작업 은 하나의 스 레 드 를 시작 하여 업 데 이 트 된 위치 정 보 를 얻 고 방송 방식 으로 보 내 는 것 입 니 다.구체 적 인 코드 는 다음 과 같 습 니 다.
package cn.teachcourse.utils;
import android.app.Activity;
import android.app.Service;
import android.content.Context;
import android.content.Intent;
import android.location.Location;
import android.location.LocationManager;
import android.os.IBinder;
import android.provider.Settings;
import android.widget.Toast;
/*
@author [email protected]
@date :2016-1-22
*/
public class LocationService extends Service {
private LocationTool mGPSTool = null;
private boolean threadDisable = false;
private final static String TAG = LocationService.class.getSimpleName();
@Override
public void onCreate() {
// TODO Auto-generated method stub
super.onCreate();
mGPSTool = new LocationTool(this);
startThread();
}
private void startThread() {
new Thread(new Runnable() {
@Override
public void run() {
while (!threadDisable) {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
if (mGPSTool != null) { // gps
//
Location location = mGPSTool.getLocation();
//
Intent intent = new Intent();
intent.putExtra("lat",
location == null ? "" : location.getLatitude()
+ "");
intent.putExtra("lon",
location == null ? "" : location.getLongitude()
+ "");
intent.setAction("cn.teachcourse.utils.GPSService");
sendBroadcast(intent);
}
}
}
}).start();
}
@Override
public void onDestroy() {
super.onDestroy();
threadDisable = true;
if (mGPSTool != null) {
mGPSTool.closeLocation();
mGPSTool = null;
}
}
@Override
public IBinder onBind(Intent intent) {
return null;
}
}
MainActivity 시작 서비스,등록 방송,위치 정보 표시MainActivity 에서 해 야 할 일 은 첫째,LocationService 서 비 스 를 시작 하고 startService()방법 을 호출 하 는 것 입 니 다.두 번 째 등록 방송 수신 기(BroadcastReceiver)는 내부 클래스 MyBroadcastReceiver 를 만 들 고 BroadcastReceiver 를 계승 하여 onReceive 방법 을 다시 씁 니 다.셋째,위도 데 이 터 를 가 져 오고 UI 인터페이스 를 업데이트 하 며 현재 위치 정 보 를 표시 합 니 다.구체 적 인 코드 는 다음 과 같 습 니 다.
//
startService(new Intent(this, LocationService.class));
//
private class MyReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Bundle bundle = intent.getExtras();
String lon = bundle.getString("lon");
String lat = bundle.getString("lat");
if (!TextUtils.isEmpty(lon) && !TextUtils.isEmpty(lat)) {
mLatitude = lat;
mLongitude = lon;
isObtainLoc = true;
new Thread(new Runnable() {
@Override
public void run() {
Message msg = new Message();
msg.what = REFRESH_UI;// ,
mHandler.sendMessage(msg);
}
}).start();
}
}
}
// UI
private Handler mHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
// TODO Auto-generated method stub
super.handleMessage(msg);
switch (msg.what) {
case REFRESH_UI:
reFreshUI();
break;
default:
break;
}
}
};
private void reFreshUI() {
if (isObtainLoc) {
mTextView.setText("
:" + mLongitude + "
:" + mLatitude);
mDialog.dismiss();
}
}
이상 은 본 고의 모든 내용 입 니 다.여러분 이 안 드 로 이 드 소프트웨어 프로 그래 밍 을 배 우 는 데 도움 이 되 기 를 바 랍 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Bitrise에서 배포 어플리케이션 설정 테스트하기이 글은 Bitrise 광고 달력의 23일째 글입니다. 자체 또는 당사 등에서 Bitrise 구축 서비스를 사용합니다. 그나저나 며칠 전 Bitrise User Group Meetup #3에서 아래 슬라이드를 발표했...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.