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