Java GPS跟踪在Android棉花糖上工作,但在较低的API上总是返回0';s

Java GPS跟踪在Android棉花糖上工作,但在较低的API上总是返回0';s,java,android,gps,Java,Android,Gps,我正在为Unity3d制作用于GPS跟踪的Android库。它在我的棉花糖上效果很好,但我在几个较低的设备上试用过,它们在任何坐标下都会得到0。这里有什么问题?我尝试了GPS_提供商和网络_提供商,得到了相同的结果。也许我遗漏了一些我应该在旧API的代码中做的改变?我的代码: package com.giganeo.gps; import android.Manifest; import android.app.Activity; import android.content.Context;

我正在为Unity3d制作用于GPS跟踪的Android库。它在我的棉花糖上效果很好,但我在几个较低的设备上试用过,它们在任何坐标下都会得到0。这里有什么问题?我尝试了GPS_提供商和网络_提供商,得到了相同的结果。也许我遗漏了一些我应该在旧API的代码中做的改变?我的代码:

package com.giganeo.gps;

import android.Manifest;
import android.app.Activity;
import android.content.Context;
import android.content.pm.PackageManager;
import android.content.pm.PermissionInfo;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.Build;
import android.os.Bundle;
import android.support.v4.content.ContextCompat;
import android.location.Location;

import java.security.Permission;

public class GPSClass  {

    private Context context;
    private static GPSClass instance;
    private LocationManager locationManager = null;
    private static LocationListener locationListener = new LocationListener() {
        @Override
        public void onLocationChanged(Location location) {

        }

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

        }

        @Override
        public void onProviderEnabled(String s) {

        }

        @Override
        public void onProviderDisabled(String s) {

        }
    };

    private GPSClass(){
        instance = this;
    }

    public static GPSClass instance(){
        if(instance == null){
            instance = new GPSClass();
        }
        return instance;
    }

    public void start(){
        if(Build.VERSION.SDK_INT >= 23){
            if(context.checkSelfPermission("android.permission.ACCESS_FINE_LOCATION") == PackageManager.PERMISSION_GRANTED) {
                locationManager = (LocationManager) context.getSystemService(Context.LOCATION_SERVICE);
                locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 0, 0, locationListener);
            }
        } else {
            if (ContextCompat.checkSelfPermission(context, "android.permission.ACCESS_FINE_LOCATION")
                    == PackageManager.PERMISSION_GRANTED) {
                locationManager = (LocationManager) context.getSystemService(Context.LOCATION_SERVICE);
                locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 0, 0, locationListener);
            }
        }
    }

    public double latitude() {
        if (Build.VERSION.SDK_INT >= 23) {
            if (context.checkSelfPermission("android.permission.ACCESS_FINE_LOCATION") == PackageManager.PERMISSION_GRANTED) {
                return locationManager.getLastKnownLocation(LocationManager.NETWORK_PROVIDER).getLatitude();
            }
        } else {
            if (ContextCompat.checkSelfPermission(context, "android.permission.ACCESS_FINE_LOCATION")
                    == PackageManager.PERMISSION_GRANTED) {
                return locationManager.getLastKnownLocation(LocationManager.NETWORK_PROVIDER).getLatitude();
            }
        }
        return 567;
    }

    public double longitude() {
        if (Build.VERSION.SDK_INT >= 23) {
            if (context.checkSelfPermission("android.permission.ACCESS_FINE_LOCATION") == PackageManager.PERMISSION_GRANTED) {
                return locationManager.getLastKnownLocation(LocationManager.NETWORK_PROVIDER).getLongitude();
            }
        } else {
            if (ContextCompat.checkSelfPermission(context, "android.permission.ACCESS_FINE_LOCATION")
                    == PackageManager.PERMISSION_GRANTED) {
                return locationManager.getLastKnownLocation(LocationManager.NETWORK_PROVIDER).getLongitude();
            }
        }
        return 567;
    }

    public double altitude() {
        if (Build.VERSION.SDK_INT >= 23) {
            if (context.checkSelfPermission("android.permission.ACCESS_FINE_LOCATION") == PackageManager.PERMISSION_GRANTED) {
                return locationManager.getLastKnownLocation(LocationManager.NETWORK_PROVIDER).getAltitude();
            }
        } else {
            if (ContextCompat.checkSelfPermission(context, "android.permission.ACCESS_FINE_LOCATION")
                    == PackageManager.PERMISSION_GRANTED) {
                return locationManager.getLastKnownLocation(LocationManager.NETWORK_PROVIDER).getAltitude();
            }
        }
        return 567;
    }

    public float horizontalAccuracy() {
        if (Build.VERSION.SDK_INT >= 23) {
            if (context.checkSelfPermission("android.permission.ACCESS_FINE_LOCATION") == PackageManager.PERMISSION_GRANTED) {
                return locationManager.getLastKnownLocation(LocationManager.NETWORK_PROVIDER).getAccuracy();
            }
        } else {
            if (ContextCompat.checkSelfPermission(context, "android.permission.ACCESS_FINE_LOCATION")
                    == PackageManager.PERMISSION_GRANTED) {
                return locationManager.getLastKnownLocation(LocationManager.NETWORK_PROVIDER).getAccuracy();
            }
        }
        return 567f;
    }

    public float verticalAccuracy() {
        if (Build.VERSION.SDK_INT >= 23) {
            if (context.checkSelfPermission("android.permission.ACCESS_FINE_LOCATION") == PackageManager.PERMISSION_GRANTED) {
                return locationManager.getLastKnownLocation(LocationManager.NETWORK_PROVIDER).getAccuracy();
            }
        } else {
            if (ContextCompat.checkSelfPermission(context, "android.permission.ACCESS_FINE_LOCATION")
                    == PackageManager.PERMISSION_GRANTED) {
                return locationManager.getLastKnownLocation(LocationManager.NETWORK_PROVIDER).getAccuracy();
            }
        }
        return 567f;
    }

    public void setContext(Context context) {
        this.context = context;
    }

    public boolean isEnabledByUser(){
        return locationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER);
    }

    public void stop() {
        if (locationListener != null) {
            locationManager.removeUpdates(locationListener);
            locationListener = null;
        }
    }
}

如果使用
requestLocationUpdates()
,则应在
onLocationChanged()
中处理位置更新。基本上依靠
getLastKnownLocation()
并不是一个好主意,尽管它似乎可以工作。(代码中有很多不必要的重复,但这更多的是一个风格问题。)重复是出于绝望。我无法使用onLocationChanged,因为它是Unity3d的库。另外,我正在尝试每半秒钟检索一次数据,我应该会看到一些变化。也许你还有其他建议?