1. 程式人生 > >Android中的ACCESS MOCK LOCATION許可權使用Demo

Android中的ACCESS MOCK LOCATION許可權使用Demo

               

轉載地址:http://mobiarch.wordpress.com/2012/07/17/testing-with-mock-location-data-in-android/

DDMS工具能用來發送模擬位置資訊在測試時。但是,他有兩個嚴格的限制:


1.DDMS設定GPS位置為GPS只位置提供者,如果你的應用用網路提供那你就不走運了。

2.DDMS設定位置給虛擬機器,你不能用真機來進行測試


如果你需要測試真機或者使用網路位置提供工具,,你將需要開發一個 偽裝提供工具在你的應用中。一個偽裝提供工具能代表任何位置提供者 - 網路或者GPS。寫一個偽裝工具很簡單。只需要主要移除掉一些特性在釋出應用錢


在這片文章中, 我們將會看到怎樣建立一個偽裝位置工具


第一,我們將開發一個類封裝對應的方法細節:

public class MockLocationProvider {  String providerName;  Context ctx;   public MockLocationProvider(String name, Context ctx)
{    this.providerName = name;    this.ctx = ctx;     LocationManager lm = (LocationManager) ctx.getSystemService(      Context.LOCATION_SERVICE);    lm.addTestProvider(providerName, false, false, false, false
, false,       true, true, 0, 5);    lm.setTestProviderEnabled(providerName, true);  }   public void pushLocation(double lat, double lon) {    LocationManager lm = (LocationManager) ctx.getSystemService(      Context.LOCATION_SERVICE);     Location mockLocation = new Location(providerName);    mockLocation.setLatitude(lat);    mockLocation.setLongitude(lon);     mockLocation.setAltitude(0);     mockLocation.setTime(System.currentTimeMillis());     lm.setTestProviderLocation(providerName, mockLocation);  }   public void shutdown() {    LocationManager lm = (LocationManager) ctx.getSystemService(      Context.LOCATION_SERVICE);    lm.removeTestProvider(providerName);  }}

o一個簡要的MockLocationProvider表述就是 

*構造方法名字取自 位置提供工具(Location Provider)。比如,LocationManager.GPS_PROVIDER. addTestProvider() 和 setTestProviderEnabled()宣告告訴LocationManager已知Provider將會被偽裝資料替換


*pushLocation()方法提供偽裝位置資訊給一個已知的Provider工具。

任何activity或者Service能很容易的用如下的類。這裡,我們能替換網路提供者用一個假的.

public class MainActivity extends Activity {  MockLocationProvider mock;  public void onCreate(Bundle savedInstanceState) {    super.onCreate(savedInstanceState);    setContentView(R.layout.activity_main);     mock = new MockLocationProvider(LocationManager.NETWORK_PROVIDER, this);     //Set test location    mock.pushLocation(-12.34, 23.45);     LocationManager locMgr = (LocationManager)        getSystemService(LOCATION_SERVICE);    LocationListener lis = new LocationListener() {      public void onLocationChanged(Location location) {          //You will get the mock location      }      //...    };     locMgr.requestLocationUpdates(      LocationManager.NETWORK_PROVIDER, 1000, 1, lis);  }   protected void onDestroy() {   mock.shutdown();   super.onDestroy();  }}


設定安全性

為了讓偽裝地址起作用,一些許可權是要設定的.

你將會需要兩個許可權

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

最後, 你需要允許 mock locations在裝置的 Settings > Developer options >Allow mock locations.


關掉 偽裝位置


這個很重要如果你要在釋出版本中偽裝位置提供者,一個很好的方法就是允許位置提供者只在應用處於測試模式中。在你的程式碼中,檢查測試標記是否設定


if ((getApplication().getApplicationInfo().flags &     ApplicationInfo.FLAG_DEBUGGABLE) != 0) {    mock = new MockLocationProvider(        LocationManager.NETWORK_PROVIDER, this);     //Set test location    mock.pushLocation(-12.34, 23.45);}
當你測試app用USB 模擬或者用虛擬機器時,模擬標記將會被自動設定為true

           

再分享一下我老師大神的人工智慧教程吧。零基礎!通俗易懂!風趣幽默!還帶黃段子!希望你也加入到我們人工智慧的隊伍中來!https://blog.csdn.net/jiangjunshow