2016-01-23 145 views
0

我想在android上找到当前用户位置。android:改进查找当前位置

我使用这些代码:

mLocationRequest = LocationRequest.create(); 
     mLocationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY); 
     mLocationRequest.setInterval(1000); // Update location every second 
if (ContextCompat.checkSelfPermission(this, android.Manifest.permission.ACCESS_FINE_LOCATION) 
       == PackageManager.PERMISSION_GRANTED) { 
      LocationServices.FusedLocationApi.requestLocationUpdates(mGoogleApiClient, mLocationRequest, this); 

      mMap.setMyLocationEnabled(true); 
      mLastLocation = LocationServices.FusedLocationApi.getLastLocation(
        mGoogleApiClient); 
      if (mLastLocation != null) { 
       lat = String.valueOf(mLastLocation.getLatitude()); 
       lon = String.valueOf(mLastLocation.getLongitude()); 

      } 
      firstLoction(); 
     } 
     else 
     { 
      Toast.makeText(this, "Not promisseion", Toast.LENGTH_SHORT).show(); 
     } 

它与一些网络(数据移动)。但不适用于所有位置。 (也适用于GPS)

我可以做更多的事情来处理网络更好吗?

+0

你不应该使用getLastLocation使用位置数据。构建LocationRequest之后,您应该根据此请求请求更新并实现LocationListener接口以接收它们。 – thetonrifles

回答

1

让您的活动实施LocationListener的接口,然后利用FusedLocationApi,即采取一切可用的供应商(例如GPS,网络)的照顾。

在你onConnected方法,你需要进行如下操作:

@Override 
public void onConnected(Bundle connectionHint) { 
    LocationRequest request = new LocationRequest(); 
    request.setInterval(10000); 
    request.setFastestInterval(5000); 
    request.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY); 
    // using fused location api, taking care of all 
    // available providers (e.g. GPS, NETWORK) 
    // here do not forget to check for available LOCATION 
    // permission before asking for updates 
    LocationServices.FusedLocationApi.requestLocationUpdates(
     mGoogleApiClient, request, this); 
} 

由于您的活动实现LocationListener的界面,您将收到onLocationChanged方法的更新。

@Override 
public void onLocationChanged(Location location) { 
    // this method is defined by LocationListener interface 
    // here you will receive location updates based 
    // on fused location api   
} 

参见here关于如何提高代码用于降低电池消耗的额外细节。

我看到您在您的活动中使用GoogleMap。也可以使用其方法setOnMyLocationChangeListener直接从GoogleMap对象获取当前位置。不幸的是,这种方法现在已被弃用,所以建议使用FusedLocationProviderApi。

1
Context ctx = this; 
     gpsLocationListener = new OLL(ctx); 
     networkLocationListener = new OLL(ctx); 
     lm = (LocationManager) getSystemService(Context.LOCATION_SERVICE); 
     Location temploc = lm.getLastKnownLocation(LocationManager.NETWORK_PROVIDER); 

if (useGPS) { 
      if (lm.isProviderEnabled(LocationManager.GPS_PROVIDER)) { 
       lm.requestLocationUpdates(LocationManager.GPS_PROVIDER, 
        5000, 1, gpsLocationListener); 
       } 
     } 
     if (lm.isProviderEnabled(LocationManager.NETWORK_PROVIDER)) { 
     lm.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 
      5000, 1, networkLocationListener); 
     } 

public class OLL implements LocationListener { 
Context ctx; 
private final static String TAG = "TAG"; 
    public OVoidLL(Context ctx) { 

     this.ctx = ctx; 
    } 
@Override 
    public void onLocationChanged(Location location) { 
Log.d(TAG, location.toString); 

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

看到这个link通过如何获得和在Android应用