没有得到一些Android手机的准确位置 [英] Not gettting accurate location in some android phones
问题描述
我使用了下面的代码。它工作正常,但在某些设备,如Redme,华硕没有得到准确的位置。它显示我离我目前的位置距离20公里以外距离。没有得到问题的人有什么想法,请分享有想法。提前感谢。
public class CurrentLocation extends Service implements LocationListener {
private final Context mContext;
// GPS状态标志
boolean isGPSEnabled = false;
//网络状态标志
boolean isNetworkEnabled = false;
// GPS状态标志
public boolean canGetLocation = false;
位置位置; //位置
双纬度; //纬度
双经度; // longitude
//改变的最小距离以米为单位的更新
private static final long MIN_DISTANCE_CHANGE_FOR_UPDATES = 10; // 10米
//以毫秒为单位的最小更新时间间隔
private static final long MIN_TIME_BW_UPDATES = 1000 * 60 * 1; // 1分钟
//声明位置管理器
受保护的LocationManager locationManager;
SetOnLocationFoundListner OLF;
public interface SetOnLocationFoundListner {
public void onLocationFound(Location location,boolean getLocRegularly,GoogleMap gmap);
}
public Currentlocation(Context context){
this.mContext = context;
getLocation();
public Location getLocation(){
try {
locationManager =(LocationManager)mContext.getSystemService(LOCATION_SERVICE);
//获取GPS状态
isGPSEnabled = locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER);
//获取网络状态
isNetworkEnabled = locationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER);
if(!isGPSEnabled&&!isNetworkEnabled){
//没有启用网络提供程序
} else {
this.canGetLocation = true;
//首先从网络供应商处获得位置
if(isNetworkEnabled){
locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER,MIN_TIME_BW_UPDATES,
MIN_DISTANCE_CHANGE_FOR_UPDATES,this);
Log.d(网络,网络);
if(locationManager!= null){
location = locationManager.getLastKnownLocation(LocationManager.NETWORK_PROVIDER);
if(location!= null){
latitude = location.getLatitude();
longitude = location.getLongitude();
$ b //如果GPS启用使用GPS服务获得经纬度
if(isGPSEnabled){
if(location == null ){
locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER,MIN_TIME_BW_UPDATES,
MIN_DISTANCE_CHANGE_FOR_UPDATES,本);
Log.d(已启用GPS,已启用GPS);
if(locationManager!= null){
location = locationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER);
if(location!= null){
latitude = location.getLatitude();
longitude = location.getLongitude();
} catch(Exception e){
e.printStackTrace();
}
返回地点;
$ b $ **
*停止使用GPS侦听器调用此函数将停止在您的
* app
* /
中使用GPS public void stopUsingGPS(){
if(locationManager!= null){
locationManager.removeUpdates(Currentlocation.this);
$ b $ **
函数获得纬度
* /
public double getLatitude(){
if(location!= null){
latitude = location.getLatitude();
}
//返回纬度
返回纬度;
$ b / **
*获取经度的函数
* /
public double getLongitude(){
if(location!= null){
longitude = location.getLongitude();
}
//返回经度
返回经度;
}
/ **
*检查GPS / wifi的功能
*
* @return boolean
* /
public boolean canGetLocation(){
return this.canGetLocation;
}
@Override
public void onLocationChanged(Location location){
// TODO自动生成的方法存根
}
@Override
public void onStatusChanged(String provider,int status,Bundle extras){
// TODO自动生成的方法存根
}
@Override
public void onProviderEnabled(String provider){
// TODO自动生成的方法存根
}
@Override
public void onProviderDisabled(String provider){
// TODO自动生成的方法存根
}
@Override
public IBinder onBind (Intent intent){
// TODO自动生成的方法存根
返回null;
}
/ **
*显示设置提醒对话框的功能在按设置按钮时,
* lauch设置选项
* /
}
既不总是有一个有效的最后的已知位置,也不会以微秒定义它的位置。
您首先调用 requestLocationUpdates()
,然后紧接着 getLastKnownLocation()
。没有时间让手机确定/更新最后的已知位置。此外,当您调用 getLocation()
时,您总是一次又一次调用 requestLocationUpdates()
。当您想开始接收位置更新时,只需调用一次即可。
只需订阅一次接收位置更新并始终获取回调中的最新位置, 。你已经有了空的 onLocationChanged()
方法。这是回调方法。
您当然可以调用 removeUpdates()
或<$ c $如果你不想要的话,一旦你在 onLocationChanged()
回调中收到新鲜和最新的位置,你可以使用removeLocationUpdates()接收任何进一步的更新。
一些有用的Stackoverflow讨论:
Android:getLastKnownLocation out -of-date - 如何强制刷新位置?
I have used below code. It work fine but in some devices like Redme,Asus not getting accurate location.It shown me too far from my current location aprox 20 km away.Not getting where is problem somebody have idea please share there ideas.Thanks in advance.
public class Currentlocation extends Service implements LocationListener {
private final Context mContext;
// flag for GPS status
boolean isGPSEnabled = false;
// flag for network status
boolean isNetworkEnabled = false;
// flag for GPS status
public boolean canGetLocation = false;
Location location; // location
double latitude; // latitude
double longitude; // longitude
// The minimum distance to change Updates in meters
private static final long MIN_DISTANCE_CHANGE_FOR_UPDATES = 10; // 10 meters
// The minimum time between updates in milliseconds
private static final long MIN_TIME_BW_UPDATES = 1000 * 60 * 1; // 1 minute
// Declaring a Location Manager
protected LocationManager locationManager;
SetOnLocationFoundListner OLF;
public interface SetOnLocationFoundListner {
public void onLocationFound(Location location, boolean getLocRegularly, GoogleMap gmap);
}
public Currentlocation(Context context) {
this.mContext = context;
getLocation();
}
public Location getLocation() {
try {
locationManager = (LocationManager) mContext.getSystemService(LOCATION_SERVICE);
// getting GPS status
isGPSEnabled = locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER);
// getting network status
isNetworkEnabled = locationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER);
if (!isGPSEnabled && !isNetworkEnabled) {
// no network provider is enabled
} else {
this.canGetLocation = true;
// First get location from Network Provider
if (isNetworkEnabled) {
locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, MIN_TIME_BW_UPDATES,
MIN_DISTANCE_CHANGE_FOR_UPDATES, this);
Log.d("Network", "Network");
if (locationManager != null) {
location = locationManager.getLastKnownLocation(LocationManager.NETWORK_PROVIDER);
if (location != null) {
latitude = location.getLatitude();
longitude = location.getLongitude();
}
}
}
// if GPS Enabled get lat/long using GPS Services
if (isGPSEnabled) {
if (location == null) {
locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, MIN_TIME_BW_UPDATES,
MIN_DISTANCE_CHANGE_FOR_UPDATES, this);
Log.d("GPS Enabled", "GPS Enabled");
if (locationManager != null) {
location = locationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER);
if (location != null) {
latitude = location.getLatitude();
longitude = location.getLongitude();
}
}
}
}
}
} catch (Exception e) {
e.printStackTrace();
}
return location;
}
/**
* Stop using GPS listener Calling this function will stop using GPS in your
* app
*/
public void stopUsingGPS() {
if (locationManager != null) {
locationManager.removeUpdates(Currentlocation.this);
}
}
/**
* Function to get latitude
*/
public double getLatitude() {
if (location != null) {
latitude = location.getLatitude();
}
// return latitude
return latitude;
}
/**
* Function to get longitude
*/
public double getLongitude() {
if (location != null) {
longitude = location.getLongitude();
}
// return longitude
return longitude;
}
/**
* Function to check GPS/wifi enabled
*
* @return boolean
*/
public boolean canGetLocation() {
return this.canGetLocation;
}
@Override
public void onLocationChanged(Location location) {
// TODO Auto-generated method stub
}
@Override
public void onStatusChanged(String provider, int status, Bundle extras) {
// TODO Auto-generated method stub
}
@Override
public void onProviderEnabled(String provider) {
// TODO Auto-generated method stub
}
@Override
public void onProviderDisabled(String provider) {
// TODO Auto-generated method stub
}
@Override
public IBinder onBind(Intent intent) {
// TODO Auto-generated method stub
return null;
}
/**
* Function to show settings alert dialog On pressing Settings button will
* lauch Settings Options
*/
}
You can not expect the phone neither to always have a valid "last known location" nor to define its location in microseconds.
You first call requestLocationUpdates()
and instantly after that getLastKnownLocation()
. There's no time for the phone to determine/update the "last known location". Besides now you always call requestLocationUpdates()
again and again when you call getLocation()
. Just call it once when you want to start receiving location updates.
Just subscribe to receive location updates once and always get the latest location in the callback that happens with a small delay. You already have the empty onLocationChanged()
method. That is the callback method. Just make that to handle the location updates.
You can of course call removeUpdates()
or removeLocationUpdates()
once you have received the fresh and up-to-date location in the onLocationChanged()
callback if you don't want to receive any further updates.
Some useful Stackoverflow discussions:
How to get location that isn't out of date?
Android: getLastKnownLocation out-of-date - how to force location refresh?
Android - Reliably getting the current location
这篇关于没有得到一些Android手机的准确位置的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!