Android系統(tǒng)模擬位置的使用方法
本文為大家分享了Android模擬位置的使用方法,支持Android6.0,供大家參考,具體內(nèi)容如下
1、開啟系統(tǒng)設(shè)置中的模擬位置
Android 6.0 以下:【開發(fā)者選項 -> 允許模擬位置】

Android 6.0 及以上:【開發(fā)者選項 -> 選擇模擬位置信息應(yīng)用】

AndroidManifest.xml
<uses-permission android:name="android.permission.ACCESS_MOCK_LOCATION" /> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
2、判斷是否開啟了系統(tǒng)模擬位置
Android 6.0 以下:使用Settings.Secure.ALLOW_MOCK_LOCATION判斷。
// Android 6.0 以下:是否開啟【允許模擬位置】
boolean canMockPosition = Settings.Secure.getInt(getContentResolver(), Settings.Secure.ALLOW_MOCK_LOCATION, 0) != 0
Android 6.0 及以上:沒有【允許模擬位置】選項,同時棄用了Settings.Secure.ALLOW_MOCK_LOCATION,無法通過上面的方法判斷。增加了【選擇模擬位置信息應(yīng)用】的方法,需要選擇使用模擬位置的應(yīng)用。但是不知道怎么獲取當(dāng)前選擇的應(yīng)用,因此通過是否能夠成功執(zhí)行addTestProvider方法來進行判斷,如果沒有選擇當(dāng)前的應(yīng)用,則addTestProvider會拋出異常。
boolean hasAddTestProvider = false;
boolean canMockPosition = (Settings.Secure.getInt(getContentResolver(), Settings.Secure.ALLOW_MOCK_LOCATION, 0) != 0)
|| Build.VERSION.SDK_INT > 22;
if (canMockPosition && hasAddTestProvider == false) {
try {
String providerStr = LocationManager.GPS_PROVIDER;
LocationProvider provider = locationManager.getProvider(providerStr);
if (provider != null) {
locationManager.addTestProvider(
provider.getName()
, provider.requiresNetwork()
, provider.requiresSatellite()
, provider.requiresCell()
, provider.hasMonetaryCost()
, provider.supportsAltitude()
, provider.supportsSpeed()
, provider.supportsBearing()
, provider.getPowerRequirement()
, provider.getAccuracy());
} else {
locationManager.addTestProvider(
providerStr
, true, true, false, false, true, true, true
, Criteria.POWER_HIGH, Criteria.ACCURACY_FINE);
}
locationManager.setTestProviderEnabled(providerStr, true);
locationManager.setTestProviderStatus(providerStr, LocationProvider.AVAILABLE, null, System.currentTimeMillis());
// 模擬位置可用
hasAddTestProvider = true;
canMockPosition = true;
} catch (SecurityException e) {
canMockPosition = false;
}
}
3、模擬位置
private class RunnableMockLocation implements Runnable {
@Override
public void run() {
while (true) {
try {
Thread.sleep(INTERVEL);
if (hasAddTestProvider() == false) {
continue;
}
try {
// 模擬位置(addTestProvider成功的前提下)
String providerStr = LocationManager.GPS_PROVIDER;
Location mockLocation = new Location(providerStr);
mockLocation.setLatitude(22); // 維度(度)
mockLocation.setLongitude(113); // 經(jīng)度(度)
mockLocation.setAltitude(30); // 高程(米)
mockLocation.setBearing(180); // 方向(度)
mockLocation.setSpeed(10); //速度(米/秒)
mockLocation.setAccuracy(0.1f); // 精度(米)
mockLocation.setTime(new Date().getTime()); // 本地時間
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
mockLocation.setElapsedRealtimeNanos(SystemClock.elapsedRealtimeNanos());
}
locationManager.setTestProviderLocation(providerStr, mockLocation);
} catch (Exception e) {
// 防止用戶在軟件運行過程中關(guān)閉模擬位置或選擇其他應(yīng)用
stopMockLocation();
}
} catch (InterruptedException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
4、停止模擬位置
/**
* 停止模擬位置,以免啟用模擬數(shù)據(jù)后無法還原使用系統(tǒng)位置
* 若模擬位置未開啟,則removeTestProvider將會拋出異常;
* 若已addTestProvider后,關(guān)閉模擬位置,未removeTestProvider將導(dǎo)致系統(tǒng)GPS無數(shù)據(jù)更新;
*/
public void stopMockLocation() {
if (hasAddTestProvider) {
try {
locationManager.removeTestProvider(LocationManager.GPS_PROVIDER);
} catch (Exception ex) {
// 若未成功addTestProvider,或者系統(tǒng)模擬位置已關(guān)閉則必然會出錯
}
hasAddTestProvider = false;
}
}
Android Studio Project


以上就是本文的全部內(nèi)容,希望對大家學(xué)習(xí)Android軟件編程有所幫助。
- 解析Android開發(fā)中多點觸摸的實現(xiàn)方法
- android 多點觸摸圖片縮放的具體實現(xiàn)方法
- 簡單講解Android開發(fā)中觸摸和點擊事件的相關(guān)編程方法
- Android修改源碼解決Alertdialog觸摸對話框邊緣消失的問題
- Android獲取點擊屏幕的位置坐標(biāo)
- Android百度地圖定位后獲取周邊位置的實現(xiàn)代碼
- android通過gps獲取定位的位置數(shù)據(jù)和gps經(jīng)緯度
- Android GridView實現(xiàn)滾動到指定位置的方法
- Android獲取當(dāng)前位置的經(jīng)緯度數(shù)據(jù)
- android獲取手指觸摸位置的方法
相關(guān)文章
Android實現(xiàn)ImageView陰影和圖層效果
這篇文章主要為大家詳細(xì)介紹了Android實現(xiàn)ImageView陰影和圖層效果,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-02-02
解決android studio引用遠(yuǎn)程倉庫下載慢(JCenter下載慢)
這篇文章主要介紹了解決android studio引用遠(yuǎn)程倉庫下載慢(JCenter下載慢),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-03-03
Android Socket實現(xiàn)多個客戶端聊天布局
這篇文章主要為大家詳細(xì)介紹了Android Socket實現(xiàn)多個客戶端聊天布局,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2022-04-04
Flutter基于Dart Unwrapping Multiple Optional小技巧
這篇文章主要為大家介紹了Flutter Unwrapping Multiple Optional打開多個選項小技巧示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-12-12

