GPS 位置提供商在 Android 中为我提供了空位置

GPS location provider gives me null location in Android

我尝试在 android 中使用 GPS_Provider 查找位置。当尝试使用 Network_Provider 获取位置时,它会给我位置并正确调用回调函数,但是当我尝试使用 GPS_Provider 获取位置时,它会给我位置 null & 也不调用 LocationListener.

的回调函数 onLocationChanged

我的代码是:

 LocationManager lm;
    boolean isNetwork = false;
    Location location;
    LocationListener locationListener;
    LocationListener loc;
    MyLocation myLocation;
    Location location1;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        lm = (LocationManager) this.getSystemService(Context.LOCATION_SERVICE);

        try {
            myLocation = new MyLocation();

            if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
                // TODO: Consider calling
                Log.e("Location", "Permission Not Given");
                return;
            }
            Log.e("Location", "Permission is Given");
            lm.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, myLocation);
            location1=lm.getLastKnownLocation(LocationManager.GPS_PROVIDER);
        }catch(Exception e)
        {

        }
    }

MyLocation.class

public class MyLocation implements LocationListener {
    @Override
    public void onLocationChanged(Location location) {

        if(location!=null)
        {

            String lat,Longi;
            lat=String.valueOf(location.getLatitude());
            Longi=String.valueOf(location.getLongitude());

            Log.e("Latitude: " , lat);
            Log.e("Longitude: " , Longi);

        }
        else
            Log.e("Location is null", "Location not Found");
    }

    @Override
    public void onStatusChanged(String provider, int status, Bundle extras) {
        Log.e("Latitude: " ,""+ provider+ " Status: "+status);
    }

    @Override
    public void onProviderEnabled(String provider) {

    }

    @Override
    public void onProviderDisabled(String provider) {
        Log.e("Latitude: " , provider);
    }
}

它给我 logcat 错误如下:

02-04 00:50:52.280 14480-14480/com.arc.locationusingnetwork E/Location: Permission is Given
02-04 00:50:52.360 14480-14480/com.arc.locationusingnetwork E/IMGSRV: :0: PVRDRMOpen: TP3, ret = 46
02-04 00:50:52.370 14480-14480/com.arc.locationusingnetwork E/IMGSRV: :0: PVRDRMOpen: TP3, ret = 49
02-04 00:50:52.370 14480-14480/com.arc.locationusingnetwork E/IMGSRV: :0: PVRDRMOpen: TP3, ret = 50
02-04 00:50:52.380 14480-14480/com.arc.locationusingnetwork E/IMGSRV: :0: PVRDRMOpen: TP3, ret = 50
02-04 00:50:52.380 14480-14480/com.arc.locationusingnetwork E/IMGSRV: :0: PVRDRMOpen: TP3, ret = 50
02-04 00:50:52.390 14480-14480/com.arc.locationusingnetwork E/IMGSRV: :0: PVRDRMOpen: TP3, ret = 52

旧的 LocationListener class 可能已被弃用。您应该使用 FusedLocationApi by Android 来获取当前位置或通过 FusedLocationAPI 的 LocationListener 接收位置更新。

这是使用 FusedLocationApi 的好教程:Android Location API

您需要移动设备才能拨打 LocationListeneronLocationChanged 作为 LocationListener 用于在位置发生变化时接收来自 LocationManager 的通知。如果 LocationListener 已使用 LocationManager.requestLocationUpdates(String, long, float, LocationListener) 方法注册到位置管理器服务,则会调用这些方法。

现在不能保证 getLastKnownLocation 始终 return Location 因为它是 return 的最后位置,但如果应用程序是新安装的或用户清除了数据,那么 gps最后已知位置 returns null 所以要处理这个你应该移动你的设备以便调用 onLocationChanged (我建议移动到开放状态以便设备快速连接到 gps)。

您可以使用 FusedLocationProviderApi,因为它是 最新的 API 并且是在 Android 中获取位置的可用可能性中最好的。 google docs : Getting the Last Known Location

您检查过您的 GNSS/GPS 是否已启用吗?

boolean gpsEnabled = locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER);