3
나는 backround 서비스에서 실행되는 효율적인 위치 검색을 구축하기위한 아이디어를 검색했습니다. 나는이 링크 Energy efficient GPS tracking을 찾았지만, 내가 찾던 것이 아니다. 나는 미터로 거리를 체크 할 수있는 간단한 솔루션을 찾고 있는데, 사용자가 타겟 위치에 가깝거나 멀리 있는지 그리고 배터리 수명을 절약 하는지를 알 것이다. 나는 시간 차원이이 알고리즘에서만 거리를 효과적으로 가지길 원하지 않는다.android에서 효율적인 GPS 서비스
참고 : 모든 권한이 있습니다. 당신은 미터에, 두 개의 GPS 위치 사이의 거리를 계산하기 위해 다음과 같은 방법을 사용할 수 있습니다
public class LocationService extends Service{
private static final int SLEEP = 250;
private static final int VIBRATE = 500;
private double targetLat;
private double targetLng;
private LocationManager manager;
private boolean alarm;
private String ring;
private Uri soundUri;
private long [] pattern;
private float minDistance;
@Override
public IBinder onBind(Intent intent) {
return null;
}
@SuppressWarnings("static-access")
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
SharedPreferences settings = PreferenceManager.getDefaultSharedPreferences(this);
targetLat = Double.parseDouble(settings.getString("lat", "0"));
targetLng = Double.parseDouble(settings.getString("lng", "0"));
targetLat = targetLat/1E6;
targetLng = targetLng/1E6;
alarm = settings.getBoolean("alarm", true);
ring = settings.getString("ringDet", "");
if(ring != ""){
soundUri = Uri.parse(ring);
}
manager = (LocationManager)getSystemService(Context.LOCATION_SERVICE);
manager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 0, minDistance, location);
manager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, minDistance, location);
pattern = new long[200];
pattern[0] = 0;
for(int i = 1; i < pattern.length; i++){
if(i % 2 != 0){
pattern[i] = SLEEP;
}
else{
pattern[i] = VIBRATE;
}
}
//return super.onStartCommand(intent, flags, startId);
return super.START_STICKY;
}
LocationListener location = new LocationListener() {
public void onStatusChanged(String provider, int status, Bundle extras) {}
public void onProviderEnabled(String provider) {}
public void onProviderDisabled(String provider) {}
@SuppressWarnings("deprecation")
public void onLocationChanged(Location location) {
float [] results = new float [3];
Location.distanceBetween(targetLat, targetLng, location.getLatitude(), location.getLongitude(), results);
float distance = results[0];
if(distance > 20000){
minDistance = 15000;
toaster(">20000");
manager.removeUpdates(this);
}
else if(distance > 10000){
minDistance = 5000;
toaster(">10000");
manager.removeUpdates(this);
}
else if(distance > 5000){
minDistance = 2500;
toaster(">5000");
manager.removeUpdates(this);
}
else if(distance > 2500){
minDistance = 1000;
toaster(">2500");
manager.removeUpdates(this);
}
else if(distance > 1000){
minDistance = 0;
toaster(">1000");
}
if(distance < 800 && alarm){
Notification notification = new Notification(R.drawable.ic_launcher, "WakeApp", System.currentTimeMillis());
Intent notificationIntent = new Intent(getApplicationContext(),MainActivity.class);
PendingIntent contentIntent = PendingIntent.getActivity(getApplicationContext(), 0, notificationIntent, 0);
notification.setLatestEventInfo(getApplicationContext(), getApplicationContext().getResources().getString(R.string.notification_message), "", contentIntent);
NotificationManager notificationManager = (NotificationManager)getSystemService(Context.NOTIFICATION_SERVICE);
//notification.defaults |= Notification.DEFAULT_VIBRATE;
notification.defaults |= Notification.DEFAULT_LIGHTS;
notification.icon = R.drawable.ic_launcher;
if(soundUri != null){
notification.sound = soundUri;
}
else if(soundUri == null){
soundUri = RingtoneManager.getActualDefaultRingtoneUri(getApplicationContext(), RingtoneManager.TYPE_ALARM);
notification.sound = soundUri;
}
notification.vibrate = pattern;
alarm = false;
notificationManager.notify(1, notification);
manager.removeUpdates(this);
stopSelf();
}
}
};
private void toaster(String text){
Toast.makeText(this, text, Toast.LENGTH_SHORT).show();
}
감사합니다. 알고리즘 GPS 검색에 대한 아이디어가 있습니까? –
@ShalomMelamed, 내 업데이트 된 답변을 확인하십시오 :) – Lucifer
안녕하세요 루시퍼, 나는 GPS가 다른 거리에서 덜 작동하는 데 도움이 귀하의 제안을 볼 수 없습니다. 내 이해에서 나는 그것이 효과적 일 것입니다 그래서 requestLocationUpdates 메서드를 사용해야합니다. 어쨌든 고마워. –