android - 通过 Android 应用程序即时获取 GPS 位置

标签 android android-emulator gps android-location

全部。我正在编写一个关于 GPS 位置的 Android 应用程序。

我在模拟器上试了一下,手动输入经纬度,没问题。 但是,我的问题是:在真实设备上,在 Debug模式下,只有在更改位置时才能通过 Intent 进入下一个类。如果我直接启动应用程序,我可以看到闪烁的 GPS 图标,但应用程序只会停留在这里,不会启动下一个 Activity 。 onLocationChanged() 中的变量似乎永远不会改变。

我听说要立即获取位置是使用 getLastKnownLocation() 方法。但是我没有找到应该使用它的地方。

这是我如何使用 LocationManager 获取位置的类。

有解决办法吗?我很困惑。非常感谢!!

    public class mainMenu extends Activity{

private LocationManager locationManager = null;

public void onCreate(Bundle savedInstanceState){
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);




    Button button1 = (Button)findViewById(R.id.button1);
    button1.setOnClickListener(new OnClickListener(){
        public void onClick(View v){

            Intent i3 = new Intent();
            i3.setClass(mainMenu.this, police.class);
            i3.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            mainMenu.this.startActivityForResult(i3,0);


        }
    });

    Button button2 = (Button)findViewById(R.id.button2);
    button2.setOnClickListener(new OnClickListener(){
        public void onClick(View v){

            Intent i3 = new Intent();
            i3.setClass(mainMenu.this, ambulance.class);
            i3.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            mainMenu.this.startActivityForResult(i3,0);


        }
    });

    Button button3 = (Button)findViewById(R.id.button3);
    button3.setOnClickListener(new OnClickListener(){
        public void onClick(View v){

            Intent i3 = new Intent();
            i3.setClass(mainMenu.this, fire_station.class);
            i3.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            mainMenu.this.startActivityForResult(i3,0);


        }
    });



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

        locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 120000 , 0, new MyLocationUpdater());

        String provider = LocationManager.GPS_PROVIDER;
        Location location = locationManager.getLastKnownLocation(provider);



}



public class MyLocationUpdater implements LocationListener{ //change location interface
    @Override
    public void onLocationChanged(Location location) {
        // TODO Auto-generated method stub
    //          store the location data
    //          get the best record



        Double lat = location.getLatitude();
        Double lon = location.getLongitude();

        System.out.println("The latitude is " + lat + "and " 
                + "the longitude is "+ lon);


        Double lat11 = lat - 1/69.0;
        Double lat12 = lat + 1/69.0;
        Double lon11 = lon - 1/42.0;
        Double lon12 = lon + 1/42.0;

        StaticVariables.latS1 = lat11.toString();
        StaticVariables.latN1 = lat12.toString();
        StaticVariables.lonW1 = lon11.toString();
        StaticVariables.lonE1 = lon12.toString();

        Double lat111 = lat - 2/69.0;
        Double lat121 = lat + 2/69.0;
        Double lon111 = lon - 2/42.0;
        Double lon121 = lon + 2/42.0;

        StaticVariables.latS11 = lat111.toString();
        StaticVariables.latN11 = lat121.toString();
        StaticVariables.lonW11 = lon111.toString();
        StaticVariables.lonE11 = lon121.toString();

    //          ==================================================
    //          ambulances

        Double lat21 = lat - 3/69.0;
        Double lat22 = lat + 3/69.0;
        Double lon21 = lon - 3/42.0;
        Double lon22 = lon + 3/42.0;

        StaticVariables.latS2 = lat21.toString();
        StaticVariables.latN2 = lat22.toString();
        StaticVariables.lonW2 = lon21.toString();
        StaticVariables.lonE2 = lon22.toString();

        Double lat211 = lat - 5.5/69.0;
        Double lat221 = lat + 5.5/69.0;
        Double lon211 = lon - 5.5/42.0;
        Double lon221 = lon + 5.5/42.0;

        StaticVariables.latS21 = lat211.toString();
        StaticVariables.latN21 = lat221.toString();
        StaticVariables.lonW21 = lon211.toString();
        StaticVariables.lonE21 = lon221.toString();

    //          ===================================================
    //          fire stations

        Double lat31 = lat - 2/69.0;
        Double lat32 = lat + 2/69.0;
        Double lon31 = lon - 2/42.0;
        Double lon32 = lon + 2/42.0;

        StaticVariables.latS3 = lat31.toString();
        StaticVariables.latN3 = lat32.toString();
        StaticVariables.lonW3 = lon31.toString();
        StaticVariables.lonE3 = lon32.toString();

        Double lat311 = lat - 2/69.0;
        Double lat321 = lat + 2/69.0;
        Double lon311 = lon - 2/42.0;
        Double lon321 = lon + 2/42.0;

        StaticVariables.latS31 = lat311.toString();
        StaticVariables.latN31 = lat321.toString();
        StaticVariables.lonW31 = lon311.toString();
        StaticVariables.lonE31 = lon321.toString();

        Intent intent = new Intent();
        intent.setClass(mainMenu.this, getPhoneNumber.class);
        mainMenu.this.startActivity(intent);
    }

    @Override
    public void onProviderDisabled(String arg0) {
        // TODO Auto-generated method stub

    }

    @Override
    public void onProviderEnabled(String arg0) {
        // TODO Auto-generated method stub

    }

    @Override
    public void onStatusChanged(String arg0, int arg1, Bundle arg2) {
        // TODO Auto-generated method stub

    }
}

    }

最佳答案

getLastKnownLocation 方法不会触发 onLocationChanged 事件。重构代码的一种方法是将作用于 Location 的逻辑移动到一个单独的方法,然后在调用 getLastKnownLocation 之后调用该方法,并从 onLocationChanged 方法。

请记住,不能保证 getLastKnownLocation 会提供有意义的 Location,因为您的设备可能在上次位置更新后已经移动。

示例代码:

public void onCreate(Bundle savedInstanceState){
    ....
    String provider = LocationManager.GPS_PROVIDER;
    Location location = locationManager.getLastKnownLocation(provider);
    updateLocation(location);
}

public class MyLocationUpdater implements LocationListener{ //change location interface
    @Override
    public void onLocationChanged(Location location) {
        updateLocation(location);
    }
    ...
}

void updateLocation(Location location) {
    Double lat = location.getLatitude();
    Double lon = location.getLongitude();

    // the rest of the code from onLocationChanged
}

关于android - 通过 Android 应用程序即时获取 GPS 位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6068614/

相关文章:

android - 如何从 Facebook 视频 URL 中提取可用的视频分辨率?

visual-studio - 如何从适用于 Android 的 Visual Studio 模拟器访问 IIS Express 中本地部署的服务

ios - 这里是 iOS map distanceToDestination

java - 创建一个按钮并以编程方式将其添加到 View 中

java - onPause() onStop() onResume() 之间的混淆

android-emulator - 将新编译的 Linux 内核镜像加载到 android 模拟器 (1.5) 时出错

android - 如何强制 GPS 提供商在 android 中获得速度?

algorithm - 寻找航路点轨迹的最快部分

android - URLConnection 无法检索完整的 Html

android - 如何在 Android 的 VS 模拟器上打开 react-native 开发菜单?