arcgis for android 學習 - (7) 在真機上 模擬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,  falsetrue,
                     falsefalsefalsefalsefalse, 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

 


 

代碼下載


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM