2013-03-27 40 views
6

什么是获取当前位置Android中的以下情形的最好办法,Android的最好的方式来获得当前位置

  1. 如果GPS不可用,从网络提供商处获得位置

  2. 如果GPS可用并且可以获得当前位置,则从GPS提供商获取位置

  3. 如果GPS可用但无法获得当前位置(即不断搜索位置),则从网络提供商处获得位置。

    现在我可以从网络获取位置,如果GPS不可用,满足上述情况的最佳答案是高度赞赏。提前致谢。

+3

看看这个库:https://code.google.com/p/little-fluffy-location-library/ – dannyroa 2013-03-27 07:08:24

+0

您是否检查旧帖子 1. http://stackoverflow.com/questions/1513485/how-do-i-get-the-current-gps-location-programmatically-in-android 2. http://stackoverflow.com/questions/3145089/what-is-the-simplest-and-most-用户当前所在位置的健壮路径/ 3145655#3145655 – surhidamatya 2013-03-27 07:29:14

+0

最简单的方法是使用像这样的更高级别的库:https://github.com/delight-im/Android -SimpleLocation – caw 2015-03-04 22:55:01

回答

0
If GPS is available and can get current location, 

对于上面的问题,你可以尝试这样的..

使用这个你可以得到当前位置的经度和纬度,然后通过获得地图的价值。

public class MyLocationListener implements LocationListener 

{ 

@Override 

public void onLocationChanged(Location loc) 

{ 

loc.getLatitude(); 

loc.getLongitude(); 

String Text = “My current location is: “ + 

“Latitud = “ + loc.getLatitude() + 

“Longitud = “ + loc.getLongitude(); 

Toast.makeText(getApplicationContext(), 

Text, 

Toast.LENGTH_SHORT).show(); 

} 

@Override 

public void onProviderDisabled(String provider) 

{ 

Toast.makeText(getApplicationContext(), 

“Gps Disabled”, 

Toast.LENGTH_SHORT).show(); 

} 

@Override 

public void onProviderEnabled(String provider) 

{ 

Toast.makeText(getApplicationContext(), 

“Gps Enabled”, 

Toast.LENGTH_SHORT).show(); 

} 

@Override 

public void onStatusChanged(String provider, int status, Bundle extras) 

{ 

} 

} 

} 
0

class member boolean mIsGpsFix;

请求GPS位置更新和建立一个倒数计时器

mCountDown.start(); 

private CountDownTimer mCountDown = new CountDownTimer(time to wait for Gps fix, same as right) 
{ 

    @Override 
    public void onTick(long millisUntilFinished) 
    { 

    } 

    @Override 
    public void onFinish() 
    { 
     // No fix after the desire amount of time collapse 
     if (!mIsGpsFix) 
     // Register for Network 
    } 
}; 
2

好了,你可以使用TimerTimerTask类。

LocationManager manager; 
TimerTask mTimertask; 
GPSLocationListener mGPSLocationListener; 
int i = 0; //Here i works as counter; 
private static final int MAX_ATTEMPTS = 250; 

public void getCurrentLocation() { 
    manager = (LocationManager) getSystemService(Context.LOCATION_SERVICE); 
    mGPSLocationListener = new GPSLocationListener(); 

    manager.addGpsStatusListener(mGPSStatusListener); 
    mTimerTask = new LocTimerTask(LocationManager.GPS_PROVIDER); 

    if (manager.isProviderEnabled(LocationManager.GPS_PROVIDER)) { 
     Log.v(TAG, "GPS ENABLED"); 
     manager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 1000L, 
       50.0f, mGPSLocationListener); 
    } else { 
     turnGPSOn(); 
     manager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 1000L, 
       50.0f, mGPSLocationListener); 
    } 

    if(manager.isProviderEnabled(LocationManager.NETWORK_PROVIDER)) { 
     manager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 1000L, 
       50.0f, mNetworkLocationListener); 
    } 

    if (manager.isProviderEnabled(LocationManager.NETWORK_PROVIDER)) { 
     Log.v(TAG, "GPS ENABLED"); 
     manager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 
       1000L, 50.0f, mGPSLocationListener); 
    } 

    myLocTimer = new Timer("LocationRunner", true); 
    myLocTimer.schedule(mTimerTask, 0, 500); 
} 

GPSStatusListener

private GpsStatus.Listener mGPSStatusListener = new GpsStatus.Listener() { 

    @Override 
    public synchronized void onGpsStatusChanged(int event) { 
     switch (event) { 
     case GpsStatus.GPS_EVENT_SATELLITE_STATUS: 
      Log.v(TAG, "GPS SAtellitestatus"); 
      GpsStatus status = manager.getGpsStatus(null); 
      mSattelites = 0; 
      Iterable<GpsSatellite> list = status.getSatellites(); 
      for (GpsSatellite satellite : list) { 
       if (satellite.usedInFix()) { 
        mSattelites++; 
       } 
      } 
      break; 

     case GpsStatus.GPS_EVENT_FIRST_FIX: 
      /* 
      * Toast.makeText(getApplicationContext(), "Got First Fix", 
      * Toast.LENGTH_LONG).show(); 
      */ 
      break; 

     case GpsStatus.GPS_EVENT_STARTED: 
      /* 
      * Toast.makeText(getApplicationContext(), "GPS Event Started", 
      * Toast.LENGTH_LONG).show(); 
      */ 
      break; 

     case GpsStatus.GPS_EVENT_STOPPED: 
      /* 
      * Toast.makeText(getApplicationContext(), "GPS Event Stopped", 
      * Toast.LENGTH_LONG).show(); 
      */ 
      break; 
     default: 
      break; 
     } 
    } 
}; 

LocationListener的

public class GPSLocationListener implements LocationListener { 

    @Override 
    public void onLocationChanged(Location argLocation) { 
     location = argLocation; 
    } 

    public void onProviderDisabled(String provider) { 

    } 

    public void onProviderEnabled(String provider) { 

    } 

    public void onStatusChanged(String provider, int status, Bundle extras) { 

    } 
} 

的TimerTask类

class LocTimerTask extends TimerTask { 
    String provider; 

    public LocTimerTask(String provider) { 
     this.provider = provider; 
    } 

    final Handler mHandler = new Handler(Looper.getMainLooper()); 

    Runnable r = new Runnable() { 
     @Override 
     public void run() { 
      i++; 
      Log.v(TAG, "Timer Task run" + i); 
      location = manager.getLastKnownLocation(provider); 

      if (location != null) { 
       Log.v(TAG, "in timer task run in if location not null"); 
       isGPS = true; 
       onLocationReceived(location); 
       myLocTimer.cancel(); 
       myLocTimer.purge(); 
       mTimerTask.cancel(); 
       return; 
      } else { 
       Log.v(TAG, "in timer task run in else location null"); 
       isGPS = false; 
       if (location == null && i == MAX_ATTEMPTS) { 
        Log.v(TAG, "if 1 max attempts done"); 
        turnGPSOff(); 
        location = manager 
          .getLastKnownLocation(LocationManager.NETWORK_PROVIDER); 
        if (location != null) { 
         Log.v(TAG, 
           "if 1 max attempts done Location from network not null"); 
         Log.v(TAG, 
           "if 1 max attempts done Location from network not null coordinates not null"); 
         onLocationReceived(location); 
         myLocTimer.cancel(); 
         myLocTimer.purge(); 
         mTimerTask.cancel(); 
         return; 
        } 
       } else { 
        return; 
       } 
      } 
      i = 0; 
     } 
    }; 

    public void run() { 
     mHandler.post(r); 
    } 
} 

这里计时器已经计划在每500毫秒运行一次。意思是,每500毫秒计时器任务的run method将被执行。在运行方法中,尝试从GPS提供商处获取具体编号的位置。的尝试(这里MAX_ATTEMPTS)说5或10.如果它获得指定的编号。的尝试然后使用该位置,否则如果计数器(这里我)的值已超过MAX_ATTEMPTS,则从网络提供商获取位置。在获取位置信息时,我已将该位置传递给回拨方法onLocationReceived(Location mLoc),您可以在该位置进一步处理位置数据。这里是你将如何使用回调方法:

监听

public interface OnLocationReceivedListener { 
public void onLocationReceived(Location mLoc); //callback method which will be defined in your class. 

}

你的类应该实现上述定义的监听器。在你的班级:

@Override 
public void onLocationReceived(Location mLoc) { 
    //Do your stuff 
} 

希望它有帮助。如果有人有更好的方法,请让我知道。

相关问题