我正在开发一个Android应用程序,其中显示地图上显示的标记。我尝试在我的移动设备上使用WI-FI / 3G / GPS每次读取和显示我当前的位置。我遇到的问题是我在地图上看不到打印的碎片和片段。 我的代码如下。
private void setUpMap(){
mMap.addMarker(new MarkerOptions().position(new LatLng(0, 0)).title("Marker"));
// Enable MyLocation Layer of Google Map
mMap.setMyLocationEnabled(true);
// Enable / Disable my location button
mMap.getUiSettings().setMyLocationButtonEnabled(true);
// Get LocationManager object from System Service LOCATION_SERVICE
LocationManager locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
// Create a criteria object to retrieve provider
Criteria criteria = new Criteria();
// Get the name of the best provider
String provider = locationManager.getBestProvider(criteria, true);
// Get Current Location
Location myLocation = locationManager.getLastKnownLocation(provider);
// set map type
mMap.setMapType(GoogleMap.MAP_TYPE_NORMAL); // MAP_TYPE_HYBRID
// Get latitude of the current location
double latitude = myLocation.getLatitude();
// Get longitude of the current location
double longitude = myLocation.getLongitude();
// Create a LatLng object for the current location
LatLng latLng = new LatLng(latitude, longitude);
// Show the current location in Google Map
mMap.moveCamera(CameraUpdateFactory.newLatLng(latLng));
// Zoom in the Google Map
mMap.animateCamera(CameraUpdateFactory.zoomTo(14));
mMap.addMarker(new MarkerOptions().position(new LatLng(latitude, longitude)).title("I am here!").snippet("success located"));
}
}
基于我的Maps Activity.java文件的上述代码,我从来没有看到tittle"我在这里"因为错误空指针异常:
double latitude = location.getLatitude();
如何解决此问题?
我昨天尝试了以下测试目的:
//启用Google地图的MyLocation层p>
mMap.setMyLocationEnabled(true);
// Enable / Disable my location button
mMap.getUiSettings().setMyLocationButtonEnabled(true);
// Get LocationManager object from System Service LOCATION_SERVICE
LocationManager locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
// Create a criteria object to retrieve provider
Criteria criteria = new Criteria();
// Get the name of the best provider
String provider = locationManager.getBestProvider(criteria, true);
// Get Current Location
Location myLocation = locationManager.getLastKnownLocation(provider);
// set map type
mMap.setMapType(GoogleMap.MAP_TYPE_NORMAL); // MAP_TYPE_HYBRID
if(myLocation != null) {
// Get latitude of the current location
double latitude = myLocation.getLatitude();
// Get longitude of the current location
double longitude = myLocation.getLongitude();
// Create a LatLng object for the current location
LatLng latLng = new LatLng(latitude, longitude);
// Show the current location in Google Map
mMap.moveCamera(CameraUpdateFactory.newLatLng(latLng));
// Zoom in the Google Map
mMap.animateCamera(CameraUpdateFactory.zoomTo(14));
mMap.addMarker(new MarkerOptions().position(new LatLng(latitude, longitude)).title("I am here!").snippet("Consider yourself located"));
} //case myLocation not null
else { //do nothing
}
}
}
尝试使用Wi-Fi连接连接到3个不同的地方后,至少打开我的api 10次。 90%的时间我打开了api,我在蓝色圆圈中看到了正确的当前位置。 10%的时间我打开了api我看到一个红色标记显示消息"我在这里!"(通常在我禁用然后在我的手机上启用位置设置时)和蓝色圆圈一起。 ..这意味着我尝试获取位置的大部分时间(网络:wi-fi)都失败了?这是提供商的问题......?
过去我开发了另一个基于javascript,CSS,html代码的项目Web界面。我使用了getCurrentLocation-javascript,它100%显示了正确的当前位置(我在一天内尝试了10个不同的地方以及我所有的当前位置,我得到了正确的位置)。 javascript是否比java更可靠地获得当前位置功能?
答案 0 :(得分:1)
您需要在调用myLocation变量之前检查它。在某些情况下,我可以而且将无效。
所以只需检查它是否为null,如果是这样,从函数返回并稍后再调用它,最终它将是vaild然后你可以得到lat和lon并添加标记。当您第一次启动应用程序并且您正在为提供程序使用gps并且尚未获得修复时,可能会发生这种情况。如果从位置更改触发的内容调用此方法,那么您需要做的就是忽略返回值为null的情况,因为一旦位置可用,将再次调用此方法。
public Location getLastKnownLocation(String provider)在API中添加 1级
返回指示上一个已知位置的数据的位置 从给定的提供者处获得的修复。
这可以在不启动提供程序的情况下完成。请注意这一点 位置可能已过时,例如,如果设备已转动 关闭并搬到另一个地方。
如果当前禁用了提供程序,则返回null。参数 provider提供者的名称返回
the last known location for the provider, or null
答案 1 :(得分:1)
根据经验,有时需要时间来接收您的第一个位置并导致nullpointerexception。这很常见。我一直在寻找Android SDK的文档,并遇到了LocationListener
。根据文档,它会在满足方法中给定参数时获取您的位置。
首先在Activity
中开发两个新方法,并在setupMap()
方法之外初始化locationManager并添加一个新变量。 (确保在setupMap()
方法中删除'LocationManager'locationManager。)
LocationManager locationManager;
boolean gotLocation = false;
public boolean validLatLng(double lat, double lng) {
if(lat != null && lng != null) {
this.gotLocation = true;
return true;
} else return false;
}
public boolean haveLocation() { return this.gotLocation; }
该方法非常简单,无需进一步解释。
让我们为你创建一个新的LocationListener ..
LocationListener mLocationListener = new LocationListener() {
public void onLocationChanged(Location location) {
// Do what you need to do.
}
}
正如您所看到的,我们没有在LocationListener
的构造函数中提供任何参数,因为它没有一个构造函数,它需要一些onLocationChanged()
方法中没有任何新东西< / p>
例如,您希望从“活动”运行的点获取第一个位置,这是可以的。现在让我们将您的地图活动中的新方法应用到onLocationChanged()
的{{1}}方法中。
mLocationListener
LocationListener mLocationListener = new LocationListener() {
public void onLocationChanged(Location location) {
if(!haveLocation() && validLatLng(location.getLatitude(), location.getLongitude()) {
Log.i("mLocationListener", "Got a location!");
// Stops the new update requests.
locationManager.removeUpdates(mLocationListener);
// Get latitude of the current location
double latitude = location.getLatitude();
// Get longitude of the current location
double longitude = location.getLongitude();
// Create a LatLng object for the current location
LatLng latLng = new LatLng(latitude, longitude);
// Show the current location in Google Map
mMap.moveCamera(CameraUpdateFactory.newLatLng(latLng));
// Zoom in the Google Map
mMap.animateCamera(CameraUpdateFactory.zoomTo(14));
mMap.addMarker(new MarkerOptions().position(new LatLng(latitude, longitude)).title("I am here!").snippet("success located"));
}
}
}
现在检查它是否已经有一个位置,如果不是那么好,继续下一个要求推送它通过if语句。当onLocationChanged()
成功并返回true时,它会输入if语句,在LogCat中输入新字符串并禁用validLatLng()
进一步更新,并将您的部分代码复制粘贴到LocationManager
方法中
现在我们已经完成了所有设置,让我们添加新内容/修改您的onLocationChanged()
方法。
setupMap()
结果,它会在收到更新时检查您的位置,如果有有效位置,则会阻止应用反复检查您的位置,并将标记添加到地图中。
我自己还没有测试过,可能会犯一些拼写错误,但它应该按照Android的文档工作。