android:改进查找当前位置
android: improving Find Current Location
我想在 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)
我可以做更多的事情来更好地处理网络吗?
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) {
}
}
让您的 activity 实现 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。
我看到您在 activity 中使用 GoogleMap。也可以通过使用其方法 setOnMyLocationChangeListener 直接从 GoogleMap 对象获取当前位置。不幸的是,这种方法现在已被弃用,因此建议使用 FusedLocationProviderApi。
请参阅如何在您的 Android 应用程序中获取和使用位置数据link
我想在 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)
我可以做更多的事情来更好地处理网络吗?
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) {
}
}
让您的 activity 实现 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。
我看到您在 activity 中使用 GoogleMap。也可以通过使用其方法 setOnMyLocationChangeListener 直接从 GoogleMap 对象获取当前位置。不幸的是,这种方法现在已被弃用,因此建议使用 FusedLocationProviderApi。
请参阅如何在您的 Android 应用程序中获取和使用位置数据link