2012-09-20 2 views
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(); 
    } 

답변

1

: 여기 내 코드 (서비스에서 실행)입니다.

public static float distFrom (float lat1, float lng1, float lat2, float lng2) 
{ 
    double earthRadius = 3958.75; 
    double dLat = Math.toRadians(lat2-lat1); 
    double dLng = Math.toRadians(lng2-lng1); 
    double a = Math.sin(dLat/2) * Math.sin(dLat/2) + 
    Math.cos(Math.toRadians(lat1)) * Math.cos(Math.toRadians(lat2)) * 
    Math.sin(dLng/2) * Math.sin(dLng/2); 
    double c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a)); 
    double dist = earthRadius * c; 

    int meterConversion = 1609; 

    return new Float(dist * meterConversion).floatValue(); 
} 

원본 소스는 내 answer입니다. 아래처럼 하나 개의 라이브러리 코드를 생성 한 GPS 좌표를 들어

, 답변에 대한

public class LocListener implements LocationListener 
{ 
    private static double lat =0.0; 
    private static double lon = 0.0; 
    private static double alt = 0.0; 
    private static double speed = 0.0; 
    private static long dateTime; 

    public static double getLat() 
    { 
     return lat; 
    } 

    public static double getLon() 
    { 
     return lon; 
    } 

    public static double getAlt() 
    { 
     return alt; 
    } 

    public static double getSpeed() 
    { 
     return speed; 
    } 

    // Added By Kalpen Vaghela on 17 09 2012 
    public static long getDateTime() 
    { 
     return dateTime; 
    } 

    @Override 
    public void onLocationChanged(Location location) 
    { 
     lat = location.getLatitude(); 
     lon = location.getLongitude(); 
     alt = location.getAltitude(); 
     speed = location.getSpeed(); 
     dateTime = location.getTime(); 
    } 

    @Override 
    public void onProviderDisabled(String provider) {} 
    @Override 
    public void onProviderEnabled(String provider) {} 
    @Override 
    public void onStatusChanged(String provider, int status, Bundle extras) {} 
} 
+0

감사합니다. 알고리즘 GPS 검색에 대한 아이디어가 있습니까? –

+0

@ShalomMelamed, 내 업데이트 된 답변을 확인하십시오 :) – Lucifer

+0

안녕하세요 루시퍼, 나는 GPS가 다른 거리에서 덜 작동하는 데 도움이 귀하의 제안을 볼 수 없습니다. 내 이해에서 나는 그것이 효과적 일 것입니다 그래서 requestLocationUpdates 메서드를 사용해야합니다. 어쨌든 고마워. –

관련 문제