当前位置: 首页 > 面试题库 >

模拟GPS位置问题

汤嘉平
2023-03-14
问题内容

我正在开发一个可获取用户指定的纬度,经度和海拔高度的APP,然后在手机上伪造该GPS位置,并在Google地图中显示我位于该位置。我对清单文件具有必需的权限,并且在开发人员设置中启用了模拟位置。

LocationManager lm = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
//lm.clearTestProviderEnabled(mocLocationProvider);
lm.addTestProvider(mocLocationProvider, false, false, false, false, false, false, false, 0, 10);
lm.setTestProviderEnabled(mocLocationProvider, true);
mockLocation = new Location(mocLocationProvider); // a string
mockLocation.setLatitude(Integer.parseInt(latitude.getText().toString()));  // double 
mockLocation.setLongitude(Integer.parseInt(longitude.getText().toString())); 
mockLocation.setAltitude(Integer.parseInt(altitude.getText().toString())); 
mockLocation.setTime(System.currentTimeMillis()); 
lm.setTestProviderLocation( mocLocationProvider, mockLocation);

但是看起来我的GPS位置在Google地图上根本没有改变,这是什么问题?

更新:我刚刚在手机上安装了一个名为“ fake GPS
location”的应用程序,该应用程序可以正常运行,但是我仍然不知道我的代码有什么问题,但是我认为我的方法是实现此目的的正式方法。

更新#2:虽然某些类似的应用程序可以在我的手机上运行,​​但是我发现了一些例外情况http://www.cowlumbus.nl/forum/MockGpsProvider.zip,但该应用程序无法在我的手机上运行。有人可以帮我解决这个问题吗?数百万的感谢!每次设置位置时都没有收到任何错误消息。

Update#3:我注意到该应用程序相当老,因此无法在4.1上运行。如果是这样,如何在新版本中执行相同的操作?我的手机是三星s3,希望对您有所帮助。

更新4:对于您的信息,我的更新2中来自应用的代码为:

package nl.cowlumbus.android.mockgps;

import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;

import android.app.Activity;
import android.content.Context;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.AsyncTask;
import android.os.Bundle;
import android.util.Log;
import android.widget.TextView;

public class MockGpsProviderActivity extends Activity implements LocationListener {
    public static final String LOG_TAG = "MockGpsProviderActivity"; 
    private static final String MOCK_GPS_PROVIDER_INDEX = "GpsMockProviderIndex";

    private MockGpsProvider mMockGpsProviderTask = null;
    private Integer mMockGpsProviderIndex = 0;

    /** Called when the activity is first created. */
    /* (non-Javadoc)
     * @see android.app.Activity#onCreate(android.os.Bundle)
     */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        /** Use saved instance state if necessary. */
        if(savedInstanceState instanceof Bundle) {
            /** Let's find out where we were. */
            mMockGpsProviderIndex = savedInstanceState.getInt(MOCK_GPS_PROVIDER_INDEX, 0);
        }

        /** Setup GPS. */
        LocationManager locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);

        if(locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER)){ 
            // use real GPS provider if enabled on the device
            locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, this);
        }
        else if(!locationManager.isProviderEnabled(MockGpsProvider.GPS_MOCK_PROVIDER)) {
            // otherwise enable the mock GPS provider
            locationManager.addTestProvider(MockGpsProvider.GPS_MOCK_PROVIDER, false, false,
                    false, false, true, false, false, 0, 5);
            locationManager.setTestProviderEnabled(MockGpsProvider.GPS_MOCK_PROVIDER, true);
        }

        if(locationManager.isProviderEnabled(MockGpsProvider.GPS_MOCK_PROVIDER)) {
            locationManager.requestLocationUpdates(MockGpsProvider.GPS_MOCK_PROVIDER, 0, 0, this);

            /** Load mock GPS data from file and create mock GPS provider. */
            try {
                // create a list of Strings that can dynamically grow
                List<String> data = new ArrayList<String>();

                /** read a CSV file containing WGS84 coordinates from the 'assets' folder
                 * (The website http://www.gpsies.com offers downloadable tracks. Select
                 * a track and download it as a CSV file. Then add it to your assets folder.)
                 */         
                InputStream is = getAssets().open("mock_gps_data.csv");
                BufferedReader reader = new BufferedReader(new InputStreamReader(is));

                // add each line in the file to the list
                String line = null;
                while ((line = reader.readLine()) != null) {
                    data.add(line);
                }

                // convert to a simple array so we can pass it to the AsyncTask
                String[] coordinates = new String[data.size()];
                data.toArray(coordinates);

                // create new AsyncTask and pass the list of GPS coordinates
                mMockGpsProviderTask = new MockGpsProvider();
                mMockGpsProviderTask.execute(coordinates);
            } 
            catch (Exception e) {}
        }
    }

    @Override
    public void onDestroy() {
        super.onDestroy();

        // stop the mock GPS provider by calling the 'cancel(true)' method
        try {
            mMockGpsProviderTask.cancel(true);
            mMockGpsProviderTask = null;
        }
        catch (Exception e) {}

        // remove it from the location manager
        try {
            LocationManager locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
            locationManager.removeTestProvider(MockGpsProvider.GPS_MOCK_PROVIDER);
        }
        catch (Exception e) {}
    }

    @Override
    public void onSaveInstanceState(Bundle savedInstanceState) {
        // store where we are before closing the app, so we can skip to the location right away when restarting
        savedInstanceState.putInt(MOCK_GPS_PROVIDER_INDEX, mMockGpsProviderIndex);
        super.onSaveInstanceState(savedInstanceState);
    }

    @Override
    public void onLocationChanged(Location location) {
        // show the received location in the view
        TextView view = (TextView) findViewById(R.id.text);
        view.setText( "index:" + mMockGpsProviderIndex
                + "\nlongitude:" + location.getLongitude() 
                + "\nlatitude:" + location.getLatitude() 
                + "\naltitude:" + location.getAltitude() );     
    }

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


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


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


    /** Define a mock GPS provider as an asynchronous task of this Activity. */
    private class MockGpsProvider extends AsyncTask<String, Integer, Void> {
        public static final String LOG_TAG = "GpsMockProvider";
        public static final String GPS_MOCK_PROVIDER = "GpsMockProvider";

        /** Keeps track of the currently processed coordinate. */
        public Integer index = 0;

        @Override
        protected Void doInBackground(String... data) {         
            // process data
            for (String str : data) {
                // skip data if needed (see the Activity's savedInstanceState functionality)
                if(index < mMockGpsProviderIndex) {
                    index++;
                    continue;
                }

                // let UI Thread know which coordinate we are processing
                publishProgress(index);

                // retrieve data from the current line of text
                Double latitude = null;
                Double longitude = null;
                Double altitude= null;
                try {
                    String[] parts = str.split(",");
                    latitude = Double.valueOf(parts[0]);
                    longitude = Double.valueOf(parts[1]);
                    altitude = Double.valueOf(parts[2]);
                }
                catch(NullPointerException e) { break; }        // no data available
                catch(Exception e) { continue; }                // empty or invalid line

                // translate to actual GPS location
                Location location = new Location(GPS_MOCK_PROVIDER);
                location.setLatitude(latitude);
                location.setLongitude(longitude);
                location.setAltitude(altitude);
                location.setTime(System.currentTimeMillis());
                location.setLatitude(latitude);
                location.setLongitude(longitude);
                location.setAccuracy(16F);
                location.setAltitude(0D);
                location.setTime(System.currentTimeMillis());
                location.setBearing(0F);

                // show debug message in log
                Log.d(LOG_TAG, location.toString());

                // provide the new location
                LocationManager locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
                locationManager.setTestProviderLocation(GPS_MOCK_PROVIDER, location);

                // sleep for a while before providing next location
                try {
                    Thread.sleep(200);

                    // gracefully handle Thread interruption (important!)
                    if(Thread.currentThread().isInterrupted())
                        throw new InterruptedException("");
                } catch (InterruptedException e) {
                    break;
                }

                // keep track of processed locations
                index++;
            }

            return null;
        }

        @Override
        protected void onProgressUpdate(Integer... values) {
            Log.d(LOG_TAG, "onProgressUpdate():"+values[0]);
            mMockGpsProviderIndex = values[0];
        }
    }
}

问题答案:

解决了问题:我添加了以下代码来设置我的当前位置,它可以成功显示在google map应用程序中。

location.setLatitude(latitude);
location.setLongitude(longitude);
location.setBearing(bearing);
location.setSpeed(speed);
location.setAltitude(altitude);
location.setTime(new Date().getTime());
location.setProvider(LocationManager.GPS_PROVIDER);
location.setAccuracy(1);

结论:如果要在新版本的android中使用模拟位置服务,则必须自己设置每个属性。



 类似资料:
  • 我有一个问题,而试图使用Android模拟位置,我的主要目标是设置Android GPS认为我们在一个不同的地方,又名假GPS。 我目前尝试了两种不同的类似解决方案,可在这两个网站上使用: 编程丛林 莫比亚奇 这两个教程都是2012年的,我不知道它们是否过时,或者我很难实现它们。 首先,我要确保我有权限: ACCESS_COARSE_LOCATION ACCESS_FINE_LOCATION AC

  • 在eclipse中,您可以使用以下命令为模拟器设置GPS位置: 选择窗口 在模拟器控制面板中,在位置控制下输入GPS坐标作为单独的经纬度坐标,并使用GPX文件进行路线回放,或使用KML文件进行多个地点标记。(确保您在“设备”面板中选择了一个设备——可从窗口访问 这在Android Studio可能吗?

  • 问题内容: 我正在尝试在android模拟器上使用gps,我有以下代码: 我在清单中添加了以下行: 并且我已经使用DDMS方法和geo fix方法设置了gps位置,但是当我运行代码时,我在Toast行上得到了一个N​​ullPointerExeption,可能是因为loc为空。 我不知道错误在哪里…您能帮我吗? 更新! 感谢您的帮助,现在我使用以下代码,但没有收到任何错误,但是它不会在onChan

  • 问题内容: 干杯,我正在尝试通过Android获取当前的GPS位置。我也遵循了这篇教程和Vogellas的文章。虽然没有用。使用LocationManager.NETWORK_PROVIDER时,无论我站在哪里,我总能得到51的纬度和9的经度。当使用LocationManager.GPS_PROVIDER时,我什么也没得到。 虽然使用GMaps时一切正常::S不知道为什么。如何像GMaps一样获取

  • 本文向大家介绍iOS 模拟自定义位置,包括了iOS 模拟自定义位置的使用技巧和注意事项,需要的朋友参考一下

  • 我有一个Android应用程序,它使用一个模拟GPS定位提供商将纬度/经度坐标输入谷歌地图导航应用程序。该应用程序适用于所有Android 4.2之前的设备,但不适用于Nexus 10。我今天做了一些研究,但没能弄清楚是什么改变了 问题似乎是LocationManager没有用新坐标更新。运行4.1的设备上的logcat的以下行(第一行来自LocationManager,第二行来自我的应用程序):