0

我想在 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)

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

4

3 回答 3

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) {
    }
}
于 2016-01-23T09:22:48.633 回答
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);
}

由于您的 Activity 实现了 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        
}

有关如何改进代码以减少电池消耗的更多详细信息,请参阅此处。

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

于 2016-01-23T09:49:39.113 回答
1

请参阅 如何在您的 Android 应用程序中获取和使用位置数据的链接

于 2016-01-23T11:13:50.657 回答