使用GPS确定用户在安卓中的速度

8
我试图在用户使用设备移动时找出用户的速度。在这里,我跟随了一个包含示例代码的链接,即:这里是SpeedDemo。
问题在于,通过使用location.getSpeed()方法,我们可以找到速度。因此,为此我更改了设备中的位置值,但每次location.getspeed()返回的值仅为“0”。为什么会这样,即使更改了位置本身。
有人知道这个问题吗?
3个回答

9

您需要跟踪位置更新,当方法onLocationChanged(Location location)触发时,您可以调用location.getSpeed();它将给您正确的速度,如果您的手机实际上正在移动。

但是,如果您在模拟器上进行测试,并通过模拟器控制器发送位置,则始终会返回0。

示例更新

public class LocationService implements LocationListener {

    LocationService locationService;
    LocationManager locationManager;
    Location lastLocation;
    private final String TAG = "LocationService" ;

    private final String MOCK_LOCAION_PROVIDER = "FAKE_PROVIDER";

    LocationService(Context ctx) {
        LocationManager locationManager = (LocationManager) ctx.getSystemService(Context.LOCATION_SERVICE);
        String mocLocationProvider = MOCK_LOCAION_PROVIDER;


        if (locationManager.getProvider(mocLocationProvider) != null) {
            locationManager.removeTestProvider(mocLocationProvider);
        }
        locationManager.addTestProvider(mocLocationProvider, false, false, false, false, true, true, true, 0, 5);

        locationManager.setTestProviderEnabled(mocLocationProvider, true);
        locationManager.requestLocationUpdates(mocLocationProvider, 0, 0,
        this);


        try {

            List<String> data = new ArrayList<String>();
            InputStream is = ctx.getAssets().open("data.txt");
            BufferedReader reader = new BufferedReader(new InputStreamReader(is));
            String line = null;
            while ((line = reader.readLine()) != null) {

                data.add(line);
            }
            // Log.e(TAG, data.size() + " lines");

            new MockLocationProvider(locationManager, mocLocationProvider, data).start();

        } catch (IOException e) {

            e.printStackTrace();
        }

    }

    class MockLocationProvider extends Thread {

        private List<String> data;
        private LocationManager locationManager;
        private String mocLocationProvider;
        private String LOG_TAG = "MockLocationProvider";

        public MockLocationProvider(LocationManager locationManager, String mocLocationProvider, List<String> data) throws IOException {

            this.locationManager = locationManager;
            this.mocLocationProvider = mocLocationProvider;
            this.data = data;
        }

        @Override
        public void run() {

            for (String str : data) {

                try {

                    Thread.sleep(5000);

                } catch (InterruptedException e) {

                    e.printStackTrace();
                }

                // Set one position
                String[] parts = str.split(",");
                Double latitude = Double.valueOf(parts[0]);
                Double longitude = Double.valueOf(parts[1]);
                float speed = Float.valueOf(parts[2]);
                Location location = new Location(mocLocationProvider);
                location.setLatitude(latitude);
                location.setLongitude(longitude);
                location.setSpeed(speed);
                // location.setAltitude(altitude);

                // Log.d(LOG_TAG, location.toString());

                // set the time in the location. If the time on this location
                // matches the time on the one in the previous set call, it will
                // be
                // ignored
                location.setTime(System.currentTimeMillis());

                locationManager.setTestProviderLocation(mocLocationProvider, location);
            }
        }
    }

    public void onLocationChanged(Location location) {
        // TODO Auto-generated method stub
        Log.e(TAG, "onLocationChanged");

        // Get Location Speed Here
        Log.d(TAG, "Speed " +location.getSpeed());



    }

    public void onProviderDisabled(String provider) {
        // TODO Auto-generated method stub
        // Log.e(TAG, "onProviderDisabled : "+provider);
    }

    public void onProviderEnabled(String provider) {
        // TODO Auto-generated method stub
        // Log.e(TAG, "onProviderEnabled : "+provider);
    }

    public void onStatusChanged(String provider, int status, Bundle arg2) {
        // TODO Auto-generated method stub
        // Log.e(TAG, "onStatusChanged : "+status);
    }
}

上述代码实际上是一个定位服务类,当您创建此类的实例时,它会注册一个虚假的位置服务(除了GPS和网络),并通过给定的文件输入一些虚假的位置参数。

以下是data.txt文件,其中包含 纬度、经度、速度,上述类读取此data.txt文件并在位置中输入虚假的纬度、经度和速度,同时通过调用 Thread.sleep() 来实现触发时间以更改位置。

data.txt 文件内容

24.856449265609735,67.04308920288086,1.64
24.856749265609735,67.04408920288086,7.64
24.856949265609735,67.04508920288086,11.64
24.857649265609735,67.04716920288086,13.64
24.857949265609735,67.04736920288086,12.64
24.857949265609735,67.04742520288086,8.64
24.857949265609735,67.04747020288086,4.64
24.856749265609735,67.04408920288086,6.11
24.856949265609735,67.04508920288086,2.12
24.857249265609735,67.04608920288086,1.1
24.856949265609735,67.04508920288086,2.13
24.857249265609735,67.04608920288086,0.6
24.856949265609735,67.04508920288086,1.19
24.857249265609735,67.04608920288086,1.6
24.856949265609735,67.04508920288086,2.12
24.857249265609735,67.04608920288086,1.15
24.857849265609735,67.04729920288086,17.64
24.857949265609735,67.04736920288086,12.64
24.857949265609735,67.04739920288086,16.64
24.857949265609735,67.04742520288086,8.64
24.857949265609735,67.04747020288086,4.64
24.856749265609735,67.04408920288086,6.11
24.856949265609735,67.04508920288086,2.12
24.857249265609735,67.04608920288086,1.1
24.856949265609735,67.04508920288086,2.13
24.857249265609735,67.04608920288086,0.6
24.856949265609735,67.04508920288086,1.19
24.857249265609735,67.04608920288086,1.6
24.856949265609735,67.04508920288086,2.12
24.857249265609735,67.04608920288086,1.15
24.857849265609735,67.04729920288086,17.64
24.857949265609735,67.04736920288086,12.64
24.857949265609735,67.04739920288086,16.64
24.857949265609735,67.04742520288086,8.64
24.857949265609735,67.04747020288086,4.64
24.856749265609735,67.04408920288086,6.11
24.856949265609735,67.04508920288086,2.12
24.857249265609735,67.04608920288086,1.1
24.857849265609735,67.04729920288086,17.64
24.857949265609735,67.04736920288086,12.64
24.857949265609735,67.04739920288086,16.64
24.857949265609735,67.04742520288086,8.64
24.857949265609735,67.04747020288086,4.64
24.856749265609735,67.04408920288086,6.11
24.856949265609735,67.04508920288086,2.12
24.857249265609735,67.04608920288086,1.15
24.856949265609735,67.04508920288086,2.13
24.857249265609735,67.04608920288086,0.6
24.856949265609735,67.04508920288086,1.19
24.857249265609735,67.04608920288086,1.6
24.856949265609735,67.04508920288086,2.12
24.857249265609735,67.04608920288086,1.15
24.856949265609735,67.04508920288086,2.13
24.857249265609735,67.04608920288086,0.6
24.856949265609735,67.04508920288086,1.19
24.857249265609735,67.04608920288086,1.6
24.856949265609735,67.04508920288086,2.12
24.857249265609735,67.04608920288086,1.15

感谢你的回复。由于我在局域网中工作,因此无法通过设备移动来解决问题。由于超出区域,GPS 对我也不起作用。因此,我通过提供虚假值来更改设备位置。然而,数值仍为“0”。有没有什么方法可以通过更改位置找到输出呢?更改的位置值已经正确打印,但输出仍然相同。 - user1357696
你是否正在使用模拟位置来输入虚假值?如果是的话,那么你还应该设置location.setSpeed(float meters)。 - Adeel Pervaiz
我刚从应用市场下载了fakeGPS应用程序,每次更改我的位置值并检查我的应用程序输出。您能否向我解释一下location.setSpeed(float meters)的作用?我在哪里可以准确使用它..? - user1357696
我的之前的代码片段运行良好。原因是,以前我只是稍微移动了一下位置。所以它不起作用。现在,我是通过车辆移动设备的。仅仅因为这个,位置值发生了变化。再次感谢Adeel。 - user1357696

1

我认为只有当特定位置的GPS中有速度组件时,getSpeed()才能起作用。否则它将一直返回0.0。

为此,您可以使用条件location.hasSpeed()方法进行检查。如果为真,则执行您的操作,否则请考虑其他方法。


你所说的是,location.hasSpeed() 方法并不适用于所有位置(具有特定的纬度和经度)。如果 location.hasSpeed() 方法不可用,则 location.getSpeed() 方法将返回 0.0? - Qadir Hussain
是的,如果您的设备GPS具有速度组件,则它才会返回正确的值,否则它将始终返回0.0。因此,请先使用hasSpeed()方法进行检查,然后再继续。@QadirHussain - Pratik Dasa

-1

首先,我们需要使用位置管理器检查GPS是否已启用。

isGPSEnabled = locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER);

然后,您需要实现GpsStatus.Listener以获取Gps更新。它将返回Gps位置更新。

GPSManager.locationListener = new LocationListener() {
                    @Override
                    public void onLocationChanged(final Location location) {
                            if (GPSManager.gpsCallback != null) {
                                    GPSManager.gpsCallback.onGPSUpdate(location);
                            }
                    }

                    @Override
                    public void onProviderDisabled(final String provider) {
                    }

                    @Override
                    public void onProviderEnabled(final String provider) {
                    }

                    @Override
                    public void onStatusChanged(final String provider, final int status, final Bundle extras) {
                    }
            };

从那个位置,你可以获取当前的速度。

speed = location.getSpeed();

请参考我的网站,了解更多详情:http://velmm.com/get-current-user-speed-using-gps-android/


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