android 位置监听器不工作?

标签 android google-maps location google-maps-api-2 locationlistener

我在 android 的 eclipse 中使用 loactionListener 时遇到问题。我已经在谷歌上搜索了一段时间,但我似乎不明白为什么这不起作用。我唯一能想到的是,也许是因为我的测试设备没有SIM卡。 (通过 wifi 提供互联网)。

我用过this作为引用,但仍然一无所获。

谁能帮我解决这个问题。

这是我 Activity 的相关部分:

public class MainMenu extends Activity implements LocationListener{
@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

            setContentView(R.layout.main_menu);
theMap = ((MapFragment)getFragmentManager().findFragmentById(R.id.the_map)).getMap();
            theMap.setMapType(GoogleMap.MAP_TYPE_SATELLITE);

            locMan = (LocationManager)getSystemService(LOCATION_SERVICE);
}
@Override
        public void onLocationChanged(Location location) {
            final Double lat = location.getLatitude();
            final Double lng = location.getLongitude();
            LatLng lastLatLng = new LatLng(lat, lng);
            String title = getString(new StringLang().textSet(userLang,"marker_title"));
            String snippit = getString(new StringLang().textSet(userLang,"marker_snip"));
            if(userMarker!=null) userMarker.remove();
            userMarker = theMap.addMarker(new MarkerOptions()
            .position(lastLatLng)
            .title(title)
            .icon(BitmapDescriptorFactory.fromResource(R.drawable.ic_launcher))
            .snippet(snippit)); 
            reverseGeoCode(lat, lng);
        }
}

我使用了一种不同的方法在 map 上显示我的位置,效果很好,但从未更新。它总是显示我最后一次使用 GPS 的位置,结果是横跨全国 60 英里。我可以看到这是有效的,但是有更好的方法吗?

旧方法:

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

            setContentView(R.layout.main_menu);
if(findViewById(R.id.the_map) != null){
                //map has loaded continue
                theMap = ((MapFragment)getFragmentManager().findFragmentById(R.id.the_map)).getMap();
                theMap.setMapType(GoogleMap.MAP_TYPE_SATELLITE);
                locMan = (LocationManager)getSystemService(Context.LOCATION_SERVICE);
                android.location.Location lastLoc = locMan.getLastKnownLocation(LocationManager.NETWORK_PROVIDER);
                LatLng lastLatLng ;
                if(lastLoc == null){
                    /* Use the LocationManager class to obtain GPS locations */
                    double latitude = 0;
                    double longitude = 0;
                    lastLatLng = new LatLng(latitude, longitude);
                    lat = latitude;
                    lng = longitude;
                    String title = getString(new StringLang().textSet(userLang,"marker_title"));
                    String snippit = getString(new StringLang().textSet(userLang,"marker_snip"));
                    if(userMarker!=null) userMarker.remove();
                    userMarker = theMap.addMarker(new MarkerOptions()
                    .position(lastLatLng)
                    .title(title)
                    .icon(BitmapDescriptorFactory.fromResource(R.drawable.your_loc_icon))
                    .snippet(snippit));

                    CameraPosition cameraPosition = new CameraPosition.Builder()
                     .target(lastLatLng)      // Sets the center of the map to user position
                        .zoom(0)                   // Sets the zoom
                        .bearing(90)                // Sets the orientation of the camera to east
                        .tilt(20)                   // Sets the tilt of the camera to 30 degrees
                        .build();                   // Creates a CameraPosition from the builder
                    currentLoc = lastLatLng;
                    theMap.animateCamera (CameraUpdateFactory.newCameraPosition(cameraPosition), 3000, null);
                    final TextView geoTagText = (TextView)findViewById(R.id.text_geoTag);
                    geoTagText.setText("We cannot find your current location, please check your settings.");
                }else{
                    double latitude = lastLoc.getLatitude();
                    double longitude = lastLoc.getLongitude();
                    lastLatLng = new LatLng(latitude, longitude);
                    lat = latitude;
                    lng = longitude;
                    animateMap(lastLatLng);

                }
            }else{
                theMap = ((MapFragment)getFragmentManager().findFragmentById(R.id.the_map)).getMap();
                theMap.setMapType(GoogleMap.MAP_TYPE_SATELLITE);
                locMan = (LocationManager)getSystemService(Context.LOCATION_SERVICE);
                android.location.Location lastLoc = locMan.getLastKnownLocation(LocationManager.NETWORK_PROVIDER);
                LatLng lastLatLng;
                double latitude = lastLoc.getLatitude();
                double longitude = lastLoc.getLongitude();
                lastLatLng = new LatLng(latitude, longitude);
                lat = latitude;
                lng = longitude;
                animateMap(lastLatLng);
                //no map to load
            }
}

    @Override
public void onLocationChanged(Location location) {
    final Double lat = location.getLatitude();
    final Double lng = location.getLongitude();
    LatLng lastLatLng = new LatLng(lat, lng);
    String title = getString(new StringLang().textSet(userLang,"marker_title"));
    String snippit = getString(new StringLang().textSet(userLang,"marker_snip"));
    if(userMarker!=null) userMarker.remove();
    userMarker = theMap.addMarker(new MarkerOptions()
    .position(lastLatLng)
    .title(title)
    .icon(BitmapDescriptorFactory.fromResource(R.drawable.ic_launcher))
    .snippet(snippit));      
}

添加一个按钮来手动重新定位用户(如果他们愿意)也很有用。

reLocBtn.setOnClickListener(new OnClickListener(){
            @Override
            public void onClick(View arg0) {
                if(menuActive == true){
                    playSound();
                    LocationManager loc = (LocationManager)getSystemService(Context.LOCATION_SERVICE);
                    android.location.Location gpsLoc = (Location) loc.getLastKnownLocation(LocationManager.GPS_PROVIDER);
                    double lat = gpsLoc.getLatitude();
                    double lng = gpsLoc.getLongitude();
                    LatLng lastLatLng = new LatLng(lat, lng);
                    animateMap(lastLatLng);
                }
            }
        });

我不确定为什么这两种方法都没有更新,但第二种方法在第一次加载时似乎效果更好。

最佳答案

您似乎没有使用 requestLocationUpdates()任何地方。在该方法中,您传递一个 LocationListener 对象,然后调用该对象来进行位置更新。

即在你的情况下:

locMan.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, this);
locMan.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 0, 0, this);

关于android 位置监听器不工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17818603/

相关文章:

android - 当我试图更改布局 xml 中的 View 顺序时,FrameLayout 中的类转换异常?

nginx - 使用 Nginx 从 URL 中删除索引文件

ios - swift :信标测距在打电话时返回空数组

Android 在 fragment 中保留 View 对象

java - Android - 大文件下载停止 - 使用异步/进度对话框

javascript - build.phonegap 写入文件的问题

google-maps - Google Maps API限制

javascript - 如何获取从源地到目的地的所有纬度和经度

android - Android map 中带有 Polygon 的自定义 TileProvider

android - isProviderEnabled 始终为网络提供商返回 true