package com.ecsmon.android.core;
import static com.ecsmon.android.constants.Constants.log;
import java.io.IOException;
import java.util.List;
import android.annotation.SuppressLint;
import android.content.Context;
import android.location.Address;
import android.location.Criteria;
import android.location.Geocoder;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.Bundle;
@SuppressLint("NewApi")
public class GPSManager {
private double currentLatitude = 0d;
private double currentLongitude = 0d;
private static Context mCtx;
private Location lastLocationBestProvider = null;
private LocationManager mLocationManager;
private GPSListenerImpl mGPSListener;
private com.ecsmon.android.core.LocationListener mOutListener;
private boolean enabled = false;
private GPSListenerImpl mNETListener;
public GPSManager(Context ctx, com.ecsmon.android.core.LocationListener locationListener) {
mCtx = ctx;
mLocationManager = (LocationManager) ctx.getSystemService(Context.LOCATION_SERVICE);
mOutListener = locationListener;
}
/**
* Start location updates
*/
public void start() {
log("#### Started tracking");
lastLocationBestProvider = getLastLocationFromBestProvider();
if (lastLocationBestProvider != null) {
currentLatitude = lastLocationBestProvider.getLatitude();
currentLongitude = lastLocationBestProvider.getLongitude();
log("lat" + currentLatitude + " long " + currentLongitude);
} else {
log("last loaction is null");
}
// mGPSListener = new GPSListenerImpl("GPS");
mNETListener = new GPSListenerImpl("NET");
mLocationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 0, 1, mNETListener);
// mLocationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 1, mGPSListener);
}
private class GPSListenerImpl implements LocationListener {
private String name = "";
public GPSListenerImpl(String name) {
log("listener created" + name);
this.name = name;
}
public void onLocationChanged(Location loc) {
log("######### LOCATION CHANGED CALLED!!!!!!!!!!!!!!!!! ##############");
if (loc != null) {
log("######### location changed " + loc.getAccuracy());
currentLatitude = loc.getLatitude();
currentLongitude = loc.getLongitude();
mOutListener.update(currentLongitude, currentLatitude);
} else {
log("location is null");
}
}
public void onProviderDisabled(String provider) {
log("provider disabled > " + name);
}
public void onProviderEnabled(String provider) {
log("provider enabled > " + name);
}
public void onStatusChanged(String provider, int status, Bundle extras) {
log("status changed");
}
}
/**
* Return last location saved in phone or null
*
* @return Location
*/
public Location getLastLocationFromBestProvider() {
if (!enabled) {
return null;
}
try {
LocationManager lm = (LocationManager) mCtx.getSystemService(Context.LOCATION_SERVICE);
Criteria criteria = new Criteria();
criteria.setAccuracy(Criteria.ACCURACY_COARSE);
criteria.setAltitudeRequired(false);
criteria.setBearingRequired(false);
criteria.setCostAllowed(true);
String strLocationProvider = lm.getBestProvider(criteria, true);
Location location = lm.getLastKnownLocation(strLocationProvider);
if (location != null) {
return location;
}
return null;
} catch (Exception e) {
log(e.getMessage());
return null;
}
}
/**
* Returns human readable address from longitude and latitude
*
* @param latitude
* @param longitude
* @return
*/
public String getAddress(Double latitude, Double longitude) {
if (!enabled) {
return null;
}
String m = "";
try {
if (!Geocoder.isPresent()) {
return null;
}
Geocoder geo = new Geocoder(mCtx);
List<Address> addresses = geo.getFromLocation(latitude, longitude, 1);
if (addresses.isEmpty()) {
return null;
} else {
if (addresses.size() > 0) {
m = addresses.get(0).getFeatureName() + ", " + addresses.get(0).getLocality() + ", "
+ addresses.get(0).getCountryName();
}
}
} catch (IOException ie) {
log("No connection.");
return null;
} catch (Exception e) {
log("Can't read adress from this cordinates : lat = " + latitude + " long " + longitude); //
return null;
}
return m;
}
/**
* Removes all location updates
*/
public void stop() {
try {
mLocationManager.removeUpdates(mGPSListener);
mLocationManager.removeUpdates(mNETListener);
} catch (Exception e) {
}
}
}
这是我获取当前位置的主类,onLocationChanged永远不会被调用。我在模拟器上测试,并通过模拟器控制发送模拟经度和纬度。请帮助这让我发疯:(
答案 0 :(得分:4)
uses-permission android:name =&#34; android.permission.ACCESS_MOCK_LOCATION&#34;
http://developer.android.com/guide/topics/location/strategies.html#MockData
答案 1 :(得分:1)
您可以使用Emulator control
更改模拟器的GPS位置值。通过执行此操作(onLocationChanged
方法将起作用),您可以在模拟器中测试您的应用程序
答案 2 :(得分:0)
问题是在模拟器上它不起作用,但在真实设备上它找到了我的位置在秒
答案 3 :(得分:0)
在我的情况下,问题是加速度计和磁场传感器的更新频率。仅将“ SensorManager.SENSOR_DELAY_FASTEST”或“ SensorManager.SENSOR_DELAY_GAME”更改为“ SensorManager.SENSOR_DELAY_NORMAL”,即可正常使用。 奇怪的是,GPS传感器的频率可以是“ SensorManager.SENSOR_DELAY_FASTEST”,并且没有任何问题。