没有得到一些Android手机的准确位置 [英] Not gettting accurate location in some android phones

查看:220
本文介绍了没有得到一些Android手机的准确位置的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我使用了下面的代码。它工作正常,但在某些设备,如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 - 如何强制刷新位置?



Android - 可靠地获取当前位置


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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆