zoukankan      html  css  js  c++  java
  • 在真机上 模拟GPS

    必须先开启“允许模拟地点” 

    方法: 打开设备的,设置 - 应用程序 - 开发 - “允许模拟地点”

     1.在 AndroidManifest.xml 里添加相应的 “允许模拟位置的权限”

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

     2.创建 一个 “用于模拟的坐标提供者”

    LocationManager locationManager = (LocationManager) mContext
    .getSystemService(Context.LOCATION_SERVICE);
    if (locationManager.getProvider(mMockProviderName) == null) {
    locationManager.addTestProvider(mMockProviderName, false, true,
    false, false, false, false, false, 0, 5);
    locationManager.setTestProviderEnabled(mMockProviderName, true);

         注意:mMockProviderName 是你随意定的名称,后面在使用(获得位置)时,用这个名称。

     3.构建(模拟的)坐标位置

    Location loc = new Location(mMockProviderName);
    loc.setTime(System.currentTimeMillis());
    loc.setLatitude(latitude);
    loc.setLongitude(longitude);
    locationManager.setTestProviderLocation(mMockProviderName, loc);
     

    Log.i("gps", String.format("once: x=%s y=%s", longitude, latitude)); 

            注意:我们可以多次间歇的调用此方法来 模拟 位置的变化。

    4.获得(使用)坐标位置。

      loc = (LocationManager) context
    .getSystemService(Context.LOCATION_SERVICE);

      loc.requestLocationUpdates(NAME_MOCK_GPS_PROVIDER, 1000, 10,

    mListener);

     这里的NAME_MOCK_GPS_PROVIDER的名称 和前面“第2步”里名称是一致的。

     好了。让代码跑起来。

    ------------------------------------ 

     package pdwy.qyzyMobile.GisModule;

    复制代码

    import android.content.Context;
    import android.location.Location;
    import android.location.LocationManager;
    import android.os.Handler;
    import android.util.Log;

    class GpsMockManager {
        private Context mContext;

        Handler mHandler1;
        public String mMockProviderName = "spoof";
        private int mPostDelayed = 10000;

        GpsFakePointProvider mGpsFakePointProvider;

        public GpsMockManager(String mockProviderName, Context context,
                Handler handler) {
            super();
            mMockProviderName = mockProviderName;
            mContext = context;
            mHandler1 = handler;

            // mGpsFakePointProvider = new ChangedPointProvider();
            mGpsFakePointProvider = new StaticPointProvider();
        }

        public String getmMockProviderName() {
            return mMockProviderName;
        }

        Runnable fakeProc = new Runnable() {

            @Override
            public void run() {
                GpsFakePoint pnt = mGpsFakePointProvider.getGpsFakePoint();
                setLocation(pnt.longitude, pnt.latitude);
                mHandler1.postDelayed(fakeProc, mPostDelayed);
            }
        };

        public void RunFake() {
            mHandler1.postDelayed(fakeProc, mPostDelayed);
        }

        public void StopFake() {
            mHandler1.removeCallbacks(fakeProc);
        }

        private void setLocation(double longitude, double latitude) {
            LocationManager locationManager = (LocationManager) mContext
                    .getSystemService(Context.LOCATION_SERVICE);
            if (locationManager.getProvider(mMockProviderName) == null) {
                locationManager.addTestProvider(mMockProviderName, false, true,
                        false, false, false, false, false, 0, 5);
                locationManager.setTestProviderEnabled(mMockProviderName, true);
            }
            Location loc = new Location(mMockProviderName);
            loc.setTime(System.currentTimeMillis());
            loc.setLatitude(latitude);
            loc.setLongitude(longitude);
            locationManager.setTestProviderLocation(mMockProviderName, loc);

            Log.i("gps", String.format("once: x=%s y=%s", longitude, latitude));
        }

        public class GpsFakePoint {

            public GpsFakePoint(double longitude, double latitude) {
                super();
                this.longitude = longitude;
                this.latitude = latitude;
            }

            public double latitude;
            public double longitude;
        }

        public interface GpsFakePointProvider {
            public GpsFakePoint getGpsFakePoint();
        }

        public class ChangedPointProvider implements GpsFakePointProvider {
            private double mLatitude = 1;
            private double mLongitude = 1;

            @Override
            public GpsFakePoint getGpsFakePoint() {
                return new GpsFakePoint(mLatitude++, mLongitude++);
            }

        }

        public class StaticPointProvider implements GpsFakePointProvider {
            public GpsFakePoint getGpsFakePoint() {
                return new GpsFakePoint(116.9152, 39.4435);
                //return new GpsFakePoint(116.8737, 39.4328);//偏左
                //return new GpsFakePoint(116.886,39.4257);
                
            }
        }

    }// end class GpsMockManager
    复制代码
  • 相关阅读:
    UVA10361
    △UVA10494
    △UVA465
    △UVA10106
    △UVA424
    阶乘的精确值
    小学生算术
    UVA156
    △UVA120
    linux应用之ntpdate命令联网同步时间
  • 原文地址:https://www.cnblogs.com/cherryhimi/p/4088673.html
Copyright © 2011-2022 走看看