Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/221.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在Android上获取当前GPS位置_Java_Android_Gps_Locationmanager_Locationlistener - Fatal编程技术网

Java 在Android上获取当前GPS位置

Java 在Android上获取当前GPS位置,java,android,gps,locationmanager,locationlistener,Java,Android,Gps,Locationmanager,Locationlistener,我正试图通过GPS功能获取用户的当前位置 编写了一个实现LocationListener public class LocationManagerHelper implements LocationListener { private static double latitude; private static double longitude; @Override public void onLocationChanged(Location loc) {

我正试图通过GPS功能获取用户的当前位置

编写了一个实现
LocationListener

public class LocationManagerHelper implements LocationListener {

    private static double latitude;
    private static double longitude;

    @Override
    public void onLocationChanged(Location loc) {
        latitude = loc.getLatitude();
        longitude = loc.getLongitude();
    }

    @Override
    public void onProviderDisabled(String provider) { }

    @Override
    public void onProviderEnabled(String provider) { }

    @Override
    public void onStatusChanged(String provider, int status, Bundle extras) {
        // TODO Auto-generated method stub

    }

    public static double getLatitude() {
        return latitude;
    }

    public static double getLongitude() {
        return longitude;
    }

}
通过一个简单的操作,我可以访问这些经度和纬度值

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    /** create a TextView and write Hello World! */
    TextView tv = new TextView(this);

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

    LocationListener mlocListener = new LocationManagerHelper();

    mlocManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0,
            mlocListener);

    if (mlocManager.isProviderEnabled(LocationManager.GPS_PROVIDER)) {
            tv.append("Latitude:- " + LocationManagerHelper.getLatitude()
                    + '\n');
            tv.append("Longitude:- " + LocationManagerHelper.getLongitude()
                    + '\n');
    } else {
        tv.setText("GPS is not turned on...");
    }

    /** set the content view to the TextView */
    setContentView(tv);

但结果总是返回0.0。无法找出问题所在。

只有在onCreate()返回后才能触发位置更新回调。如果将lat/long变量初始化为伪值,您可能会看到正在打印这些值

在onLocationChanged中添加一些日志,这样您就可以看到它被触发了,然后阅读一些android应用程序在回调和更新UI方面的工作原理


还要确保您的应用程序在其清单中具有适当的权限。

当您在emulator上检查它时,它将给出0.0。您必须将位置传递给emulator。 您可以从C:\android-sdk\u r06\android sdk windows\tools\ddms.bat文件传递此信息

在ddms中有一个名为emulator controls的选项卡。从那里您可以将位置传递给emulator。
试试这个。希望它能起作用。

获得mLocListener后-设置如下所示的条件


字符串提供程序
标准hdCrit=新标准()
hdCrit.SetAccurance(标准精度\u粗略)
mlocProvider=mlocManager.getBestProvider(hdCrit,true);

然后使用getLastKnownLocation


tv.append(“\n\n位置(从最后一个已知位置开始):”
Location currentLocation=mlocManager.getLastKnownLocation(mlocProvider);

确保您的舱单中有这些

使用权限android:name=“android.permission.ACCESS\u\u LOCATION”
使用权限android:name=“android.permission.ACCESS\u FINE\u LOCATION”

如果您在DDMS透视图中使用Emulator,请在Emulator控件选项卡中查找位置控件。然后使用“手动”选项卡设置经度和纬度,然后单击“发送”-在程序运行时执行此操作您会看到对onLocationchanged的调用。更改登录位置是个好主意


顺便说一句,requestLocationUpdates中的参数设置为“…0,0…”-它会耗尽你的电池-我看到手机在6-8小时内熄灭-将其更改为“…30000,100…”-第一个参数以毫秒为单位,另一个参数以米为单位。

位置更新实际上是异步的。这意味着API不会让调用线程等待新位置可用;相反,您使用一个特定的方法(回调)注册一个观察者对象,该方法在计算新位置时被调用

在中,观察者是一个对象,位置更新的主回调是

下面是一个试图解释这一点的图表(希望这对您有所帮助,而不是让您感到困惑!)

因此,根据您当前的代码:

  • 将mlocListener声明为活动子类的成员
  • 在LocationListener实现中添加日志输出(Logcat行)
  • 保持代码的其余部分不变
  • 如果尚未在清单中添加正确的权限(GPS需要)
  • 尝试将手机连接到互联网并靠近窗口,以便获得相当快的GPS定位(应为~30秒)
然后启动应用程序,观察logcat中发生的情况。您将看到状态更改和位置更新不会在初始请求后立即发生,因此可以解释为什么textview总是显示(0.0,0.0)

更多信息:

如何创建应用程序

通过操作获取当前位置坐标(获取位置) 横向/纵向

将位置发布到要在地图上显示的Web服务器。(提交) 清除按钮以清除旧位置(清除位置)或在(提交)上清除(0.0.0.0)


非常感谢你的解释。这很有效。。日志每30秒只打印一次lon/lat值。现在,我必须获取这些值并更新UI。这并不是对guys问题的建设性回答。“如果您同时使用网络提供商和GPS提供商,那么您只需要请求访问位置权限,因为它包括两个提供商的权限。(访问\u粗略\u位置的权限包括仅对网络\u提供商的权限。)”。您只需添加一个权限(访问\u粗略\u位置或访问\u精细\u位置),而不是同时添加两个权限。如果您不想编写那么多代码并拥有更简单的界面,请使用