【问题标题】:Google maps api not placing marker at fine location谷歌地图 api 没有在正确的位置放置标记
【发布时间】:2012-05-03 04:56:48
【问题描述】:

我的代码应该在进入应用程序时找出用户的位置并在地图上放置一个标记。我的位置值始终等于 null,并且永远不会收到值。

if (location != null) {
                lat = (int) (location.getLatitude() * 1E6);
                longi = (int) (location.getLongitude() * 1E6);
                GeoPoint ourLocation = new GeoPoint(lat, longi);
                OverlayItem overlayItem = new OverlayItem(ourLocation, "AYO",
                        "Whats good yo");
                CustomPinpoint custom = new CustomPinpoint(d, CampusMap.this);
                custom.insertPinpoint(overlayItem);
                overlayList.add(custom);

            } else {
                Toast.makeText(CampusMap.this, "Couldn't get provider",
                        Toast.LENGTH_SHORT).show();

            }

        }

【问题讨论】:

  • 参考这个LINK 它对您的要求以及如何放置标记有清晰明了的解释。
  • 可能在您输入 if 语句时您的 google 搜索还没有准备好?我使用 google maps javascript api,搜索完成时会调用一个回调函数。不知道它在android上是如何工作的。
  • 我可以很好地放置标记,我的问题是它在开始时没有很好的位置。我也将此代码放入了我的 on create 方法中,它只是一直希望直接指向我的 else 语句。和我的权限有关吗?
  • 这意味着您找不到位置?

标签: java android google-maps geolocation overlay


【解决方案1】:

我在制作 GPS RPG 时遇到了一个相对类似的问题,以下是我注意到的一些事情:

首先,最初找到您的位置可能需要一段时间,这会导致该问题,因为您只检查位置是否为空。

您可能还需要确保在执行任何操作之前实际启用了设备的定位服务:

private boolean doLocationsCheck(){
    if(!checkLocationEnabled()){

        final CharSequence[] items = {"Yes", "No"};

        AlertDialog.Builder builder = new AlertDialog.Builder(mContext);
        builder.setCancelable(false);
        builder.setTitle("Location must be enabled to play this game! Would you like to enable it now?");
        builder.setItems(items, new DialogInterface.OnClickListener() {
            public void onClick(DialogInterface dialog, int item) {
                final int i = item;
                runOnUiThread(new Runnable() {
                    public void run() {                         
                        if(i == 0){
                            Intent intent = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS);
                            startActivity(intent);
                            quit();
                        }
                        else{
                            quit();
                        }

                    }
                });
            }


        }).show();
        AlertDialog alert = builder.create();

        return false;

    }
    else {
        return true;
    }
}

private boolean checkLocationEnabled(){

    LocationManager service = (LocationManager) getSystemService(LOCATION_SERVICE);
    boolean enabled = service.isProviderEnabled(LocationManager.GPS_PROVIDER) || service.isProviderEnabled(LocationManager.NETWORK_PROVIDER);

    return enabled;
}

在确定提供程序可用后,我设置如下连接:

    private void setupLocation() {

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

    LocationListener locationListener = new LocationListener() {
        public void onLocationChanged(final Location location) {
            runOnUiThread(new Runnable() {
                public void run() {
                    mLocation = location;
                    //Log.d(TAG, "Latitude: " + location.getLatitude() + " - Longitude: " + location.getLongitude());

                    saveLocation();
                }
            });   
        }

        public void onStatusChanged(String provider, int status, Bundle extras) {}

        public void onProviderEnabled(String provider) {}

        public void onProviderDisabled(String provider) {}
    };

            //Can set to GPS or network, whichever is available
    locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, locationListener);
}

该位置在更新时设置在全局变量中,然后保存到首选项中。这样,如果启用了提供程序,但需要一段时间来检索位置,用户仍然可以继续使用应用程序存储的最后一个已知位置(不适用于程序第一次正在运行)。

我知道我在那里遗漏了很多,但我认为这并不是真正必要的,因为它要么是不言自明的,要么已经在之前的答案中解释过。

干杯~

【讨论】:

    【解决方案2】:

    你必须在onstartActivity中在oncreate之前初始化locationlistener,以便它在onCreate之前获取location值。

    【讨论】:

      【解决方案3】:
       /*
       * getting the best location using the location manager
       * Constants.MINIMUM_TIME_BETWEEN_UPDATES = 1000 Constants.MINIMUM_TIME_BETWEEN_UPDATES     = 1
       */
      LocationManager mLocation;
      private String mBestProvider;
       //   in your onCreate() do the following
          mLocation = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
          Criteria criteria = new Criteria();
      mBestProvider = mLocation.getBestProvider(criteria, false);
      Location location = mLocation.getLastKnownLocation(mBestProvider);
      mLocation.requestLocationUpdates(
                  LocationManager.GPS_PROVIDER, 
                  Constants.MINIMUM_TIME_BETWEEN_UPDATES, 
                  Constants.MINIMUM_DISTANCE_CHANGE_FOR_UPDATES,
                  new LocationListenerManager()
          );
      
      
      // and use the following locationListener inner class
      
      
      private class LocationListenerManager implements LocationListener {
      
          public void onLocationChanged(Location location) {
              String message = String.format(
                      "New Location \n Longitude: %1$s \n Latitude: %2$s",
                      location.getLongitude(), location.getLatitude()
              );
              latitude = location.getLatitude();
              longitude = location.getLongitude();
              Toast.makeText(MapViewActivity.this, message, Toast.LENGTH_LONG).show();
              Log.v("poiint=====", ""+message);
      
          }
      
          public void onStatusChanged(String s, int i, Bundle b) {
              Toast.makeText(MapViewActivity.this, "Provider status changed",
                      Toast.LENGTH_LONG).show();
          }
      
          public void onProviderDisabled(String s) {
              Toast.makeText(MapViewActivity.this,
                      "Provider disabled by the user. GPS turned off",
                      Toast.LENGTH_LONG).show();
          }
      
          public void onProviderEnabled(String s) {
              Toast.makeText(MapViewActivity.this,
                      "Provider enabled by the user. GPS turned on",
                      Toast.LENGTH_LONG).show();
          }
      
      } 
      

      【讨论】:

        猜你喜欢
        • 2016-09-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-30
        • 1970-01-01
        相关资源
        最近更新 更多