【问题标题】:android: improving Find Current Locationandroid:改进查找当前位置
【发布时间】:2016-04-29 22:28:19
【问题描述】:

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

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

【问题讨论】:

  • 您不应使用 getLastLocation。构建 LocationRequest 后,您应该根据此请求请求更新并实现 LocationListener 接口以接收它们。

标签: android google-maps android-fusedlocation


【解决方案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        
}

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

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

【讨论】:

    【解决方案2】:
    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) {
        }
    }
    

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-10-30
        • 2016-11-18
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多