无法在Google地图v2上显示当前位置

时间:2014-12-11 17:05:22

标签: android google-maps

我正在开发一个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层

    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更可靠地获得当前位置功能?

2 个答案:

答案 0 :(得分:1)

您需要在调用myLocation变量之前检查它。在某些情况下,我可以而且将无效。

所以只需检查它是否为null,如果是这样,从函数返回并稍后再调用它,最终它将是vaild然后你可以得到lat和lon并添加标记。当您第一次启动应用程序并且您正在为提供程序使用gps并且尚未获得修复时,可能会发生这种情况。如果从位置更改触发的内容调用此方法,那么您需要做的就是忽略返回值为null的情况,因为一旦位置可用,将再次调用此方法。

http://developer.android.com/reference/android/location/LocationManager.html#getLastKnownLocation%28java.lang.String%29

  

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的文档工作。

相关问题