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
您需要移动设备才能拨打 LocationListener
的 onLocationChanged
作为
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);
我尝试在 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
您需要移动设备才能拨打 LocationListener
的 onLocationChanged
作为
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);