安卓 - 无法在模拟器上获取GPS位置

8

我正在尝试在 Android 模拟器上使用 GPS,我有以下代码:

public class NL extends Activity {

 private LocationManager locmgr = null;

 @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.nl);

        locmgr = (LocationManager) getSystemService(Context.LOCATION_SERVICE);

        Criteria crit = new Criteria();
        crit.setAccuracy(Criteria.ACCURACY_FINE);
        String provider = locmgr.getBestProvider(crit, true);
        Location loc = locmgr.getLastKnownLocation(provider);


        Toast msg = Toast.makeText(this, "Lon: " + Double.toString(loc.getLongitude()) + " Lat: " + Double.toString(loc.getLatitude()), Toast.LENGTH_SHORT);
        msg.show();
    }
}

我已在清单文件中添加了以下行:

我已在清单文件中添加了以下行:

<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />

我已经使用DDMS方法和geo fix方法设置了GPS位置,但是当我运行代码时,在Toast行会得到一个NullPointerException,可能是因为loc为空。

我不明白错误在哪里...你能帮我吗?


更新!

感谢您的帮助,现在我使用以下代码,我没有得到任何错误,但它不会运行onChangeLocation内部的代码...它不会运行Toast并且在日志中不返回任何消息!

 public class NL extends Activity {

        private LocationManager locmgr = null;

        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.nl);

            locmgr = (LocationManager) getSystemService(Context.LOCATION_SERVICE);

         // Define a listener that responds to location updates
            LocationListener locationListener = new LocationListener() {
                public void onLocationChanged(Location loc) {
                  // Called when a new location is found by the network location provider.
                    Log.i("NOTIFICATION","onLocationChenged Triggered");

                    Toast msg = Toast.makeText(NetworkLocator.this, "Lon: " + Double.toString(loc.getLongitude()) + " Lat: " + Double.toString(loc.getLatitude()), Toast.LENGTH_SHORT);
                    msg.show();
                }

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

                public void onProviderEnabled(String provider) {}

                public void onProviderDisabled(String provider) {}
              };

            // Register the listener with the Location Manager to receive location updates
            locmgr.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 0, 0, locationListener);
        }
    }

谢谢!


2
你是否验证了locmgr.getBestProvider是否确实返回“gps”?无论如何,你应该一定要实现一个LocationListener并将其传递给LocationManager,使用*requestLocationUpdates()*。 - guido
getBestProvider返回“gps”。即使我尝试使用lastKnownLocation获取位置,我是否需要添加LocationListener?感谢您的帮助。 - Marco Faion
你好,宏,你得到解决方案了吗? - Pinki
感谢您的帮助,使用requestLocationUpdates后应用程序运行良好,但我认为“onLocationChange”从未被触发...不确定是否因为我将时间和距离参数设置为0:locmgr.requestLocationUpdates(LocationManager.NETWORK_PROVIDER,0,0,locationListener); - Marco Faion
1
将一个日志输出放到 onLocationChange 中,并查看 Logcat 是否有输出... - Beasly
显示剩余3条评论
4个回答

9

模拟器一开始没有任何位置信息。根据文档,'getLastKnownLocation'方法可能会返回null,所以这是可以接受的。在这种情况下,您应该等待位置更新(您可以使用LocationManager的requestLocationUpdates方法)。您可以通过以下命令触发模拟器的GPS模块进行位置更新:

adb -e emu geo fix 50 50

7

找到了解决方案:

LocationManager.NETWORK_PROVIDER是错误的。

更正:LocationManager.GPS_PROVIDER


1
根据我的经验,当提供者设置为NETWORK_PROVIDER时,模拟器似乎不会响应通过DDMS发送的位置更改,但是当它设置为GPS_PROVIDER时,它会响应,就像你所指出的那样。对我来说,这看起来像是模拟器的限制,或者至少是一个不明显的行为。 - Mick

1

如果您已经完成了所有您所描述的操作,但仍然无法使用 GPS 定位,请检查模拟器中是否开启了 GPS。请前往设置:->位置和安全性:->并确保勾选了使用 GPS 卫星。


编辑:我认为你需要使用没有标准类型的位置管理器。



LocationManager mlocManager = (LocationManager)getSystemService(Context.LOCATION_SERVICE);

loc=mlocManager.getLastKnownLocation(LocationManager.GPS_PROVIDER);

然后尝试获取经度和纬度。


“使用GPS卫星”已被选中。 - Marco Faion

0

你确定你的模拟设备真的支持GPS吗?我认为还有一个额外的选项...

这可能也会有所帮助:

谢谢!对于所有人:您可以随时在Eclipse中更改项目的构建目标:在Package Explorer中右键单击项目,选择属性> Android,然后勾选“Google API”作为项目目标。--使用非英语文化设置的开发人员可能会注意到,在位置控件中按下发送按钮不会将新位置发送到Android模拟器。它将在即将发布的SDK工具版本7中修复;对于快速修复,您可以将区域设置更改为'en'。(有关详细信息,请参见code.google.com/p/android/issues/detail?id=915。)- Patrick de Kleijn

来源:在模拟器上无法获取地理位置 - Android


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接