部分手机的Android GPS定位请求失败

Posted

技术标签:

【中文标题】部分手机的Android GPS定位请求失败【英文标题】:Android GPS Location Request Failed for Some Phones 【发布时间】:2014-12-23 09:47:39 【问题描述】:

我目前正在使用 android.location.API 开发一个 android 应用程序。

通常 GPS 定位请求在某些手机(Galaxy Note2)中成功,但在其他手机(Galaxy S3 和 S4)中失败(getLastKnownLocation() 返回 null)。

如果我首先激活三星内置功能“GPS Satellite View”,它会扫描可用的卫星,那么 GPS 在 S3 和 S4 上工作很奇怪。

我的猜测是 S3 和 S4 都使用了 GPS 信号较差的 Mediatek 芯片。那么有人知道如何在android中执行类似扫描卫星的功能吗?

请注意,我的应用在中国使用,因此请不要推荐任何与 Google 相关的服务。

谢谢。

public class MyLocationManager implements android.location.LocationListener

    private static MyLocationManager instance = null;
    private Location currentLocation;
    private String provider;
    private LocationManager locationManager;
    private Context context;

    public static MyLocationManager getInstance()
        if (instance == null)
            instance = new MyLocationManager();
        
        return instance;
    

    public boolean hasLocation()
        if(currentLocation == null)
            return false;
         else
            return true;
        
    

    public float distanceInMetersFromLocation(double latitude, double longitude)
        if (currentLocation == null)
            return -1;
        
        float[] results = new float[3];
        Location.distanceBetween(currentLocation.getLatitude(), currentLocation.getLongitude(), latitude, longitude, results);

        return results[0];
    


    public void startListenLocation(Context context) 

        this.context = context;

        locationManager = (LocationManager) context.getSystemService(Context.LOCATION_SERVICE);
        boolean gpsEnabled = locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER);
        boolean wifiEnabled = locationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER);

        if (gpsEnabled)
            provider = LocationManager.GPS_PROVIDER;
            Log.e("MyLocationManager", "GPS");
         else if (wifiEnabled)
            provider = LocationManager.NETWORK_PROVIDER;
            Log.e("MyLocationManager", "NetWork");
         else 
            Log.e("MyLocationManager", "Please Enable Location Service");
            return;
        

        requestLocationUpdates();

        if(provider.equals(LocationManager.GPS_PROVIDER))
            currentLocation = locationManager.getLastKnownLocation(provider);
         else
            currentLocation = locationManager.getLastKnownLocation(provider);
        

        if(currentLocation == null && provider.equals(LocationManager.GPS_PROVIDER))
            Log.e("MyLocationManager", "GPS Failed");
            if(wifiEnabled)
                Log.e("MyLocationManager", "Use Wifi");
                provider = LocationManager.NETWORK_PROVIDER;
                requestLocationUpdates();
                currentLocation = locationManager.getLastKnownLocation(provider);
            else
                return;
            
        

    

    public void stopListenLocation()
        //stop updating after retrieving the location
        locationManager.removeUpdates(this);
    

    public void requestLocationUpdates()
        if(provider != null && !provider.isEmpty())
            locationManager.requestLocationUpdates(provider, 60000, 10, this);
         else
            Log.e("MyLocationManager", "Request Location Updates Failed: Provider is null.");
        
    


    @Override
    public void onLocationChanged(Location location) 
        currentLocation = location;
        Log.d("SONIC", "location changed to "+location);

    

    @Override
    public void onStatusChanged(String s, int i, Bundle bundle) 

    

    @Override
    public void onProviderEnabled(String s) 

    

    @Override
    public void onProviderDisabled(String s) 

    


【问题讨论】:

首先您必须确保 GPS 已启用。第二件事是 getLastKnownLocation() 不能保证它有最后一个位置。因此,您需要检查 GPS 是否无法提供位置,而不是使用 NETWORK 提供程序来获取位置。 @BirajZalavadia 嗨,我确定 GPS 已启用。我的网络定位适用于所有设备,但我只想确保 GPS 正常工作。我只是想知道为什么 getLastKnownLocation() 在相​​同条件下适用于某些设备。我尝试了 GPS 的 requestLocationUpdates() 但它也没有工作。您对此有解决方案吗?谢谢 【参考方案1】:

其实这是设备问题。

某些设备不支持getLastKnownLocation(例如摩托罗拉 XT720)。您必须自己实现LocationListener 并将onLocationChanged 中的位置更新保存到数据库或sharedpreferences。当getLastKnownLocation 为空时,使用保存的位置。

您可以使用 Best Provider 方法来尽可能快地获得位置。

阅读this博客希望对您有所帮助。

【讨论】:

嗨,我不确定。我可以上传我的代码,您可以帮我检查一下吗? 你的代码没问题。但是 GPS 的问题是它在构建时不准确,初始化可能需要 1 分钟。它还取决于 GPS 硬件质量。如果您在晴朗的天空下尝试,它会起作用。 回到我的问题:硬件问题。正如我所注意到的,三星内置功能可以在大约 10 秒内初始化,然后我可以在我的应用程序中使用 GPS 进行定位。所以可能有一种方法可以快速初始化 GPS。 因为这都是关于硬件的,所以我们无能为力,因为在硬件响应之前没有办法得到它。 您可以使用 Best Provider 方法来尽可能快地获得位置。

以上是关于部分手机的Android GPS定位请求失败的主要内容,如果未能解决你的问题,请参考以下文章

获取定位失败怎么办

我的GPS定位 我开了为啥还显示定位失败

安卓手机定位失败怎么办?

请问一下定位怎么会经常获取位置失败,是啥原因?

手机定位开启了,怎么还是定位失败

Android如何开启GPS定位服务?