描述
我在嘗試使用android模拟位置時遇到了問題,我的主要目标是将Android GPS設定為認為我們處于不同的位置,AKA假GPS.
目前的嘗試
我目前嘗試了兩種不同的類似解決方案,可以在這兩個網站上找到:
這兩個教程都是從2012年開始的,我不知道它們是否已經過時,或者我很難實作它們.
編碼開發
首先,我確定我有權限:
> ACCESS_COARSE_LOCATION
> ACCESS_FINE_LOCATION
> ACCESS_MOCK_LOCATION *
注意:1和2都被檢查,如果它們不可用我請求使用requestPermissions函數的權限.第三個是不可用的,事實上它隻能通過AndroidManifest.xml在調試模式下添加.
我還確定在“設定”中選擇了我的APP>開發人員選項>允許模拟地點.
畢竟,我已經嘗試通過OnCreate方法或OnClick按鈕調用此函數:
public void mockLocation(){
LocationManager lm = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
Criteria criteria = new Criteria();
criteria.setAccuracy( Criteria.ACCURACY_FINE );
String mocLocationProvider = lm.getBestProvider( criteria, true );
if ( mocLocationProvider == null ) {
Toast.makeText(getApplicationContext(), "No location provider found!", Toast.LENGTH_SHORT).show();
return;
}
lm.addTestProvider(mocLocationProvider, false, false,
false, false, true, true, true, 0, 5);
lm.setTestProviderEnabled(mocLocationProvider, true);
Location loc = new Location(mocLocationProvider);
Location mockLocation = new Location(mocLocationProvider); // a string
mockLocation.setLatitude(-26.902038); // double
mockLocation.setLongitude(-48.671337);
mockLocation.setAltitude(loc.getAltitude());
mockLocation.setTime(System.currentTimeMillis());
lm.setTestProviderLocation( mocLocationProvider, mockLocation);
Toast.makeText(getApplicationContext(), "Working", Toast.LENGTH_SHORT).show();
}
如果我以這種方式編譯和測試,我将收到Toast:“找不到位置提供者!”.但是,如果我将mocLocationProvider更改為:
String mocLocationProvider = LocationManager.NETWORK_PROVIDER;
我得到了APP崩潰,在LogCat中它說在此行中崩潰了:
lm.setTestProviderLocation(mocLocationProvider, mockLocation);
是以我目前沒有選擇,也不知道如何推進.
解決方法:
你必須設定
第一:
allow mock location in setting
第二集權限:
ACCESS_COARSE_LOCATION
ACCESS_FINE_LOCATION
ACCESS_MOCK_LOCATION
第三種使用這種方法:
setMock(some_lat,some_lon,some accuracy);
private void setMock(double latitude, double longitude, float accuracy) {
locMgr.addTestProvider (LocationManager.GPS_PROVIDER,
"requiresNetwork" == "",
"requiresSatellite" == "",
"requiresCell" == "",
"hasMonetaryCost" == "",
"supportsAltitude" == "",
"supportsSpeed" == "",
"supportsBearing" == "",
android.location.Criteria.POWER_LOW,
android.location.Criteria.ACCURACY_FINE);
Location newLocation = new Location(LocationManager.GPS_PROVIDER);
newLocation.setLatitude(latitude);
newLocation.setLongitude(longitude);
newLocation.setAccuracy(accuracy);
newLocation.setAltitude(0);
newLocation.setAccuracy(500);
newLocation.setTime(System.currentTimeMillis());
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
newLocation.setElapsedRealtimeNanos(SystemClock.elapsedRealtimeNanos());
}
locMgr.setTestProviderEnabled(LocationManager.GPS_PROVIDER, true);
locMgr.setTestProviderStatus(LocationManager.GPS_PROVIDER,
LocationProvider.AVAILABLE,
null,System.currentTimeMillis());
locMgr.setTestProviderLocation(LocationManager.GPS_PROVIDER, newLocation);}
标簽:java,android,android-studio,gps
來源: https://codeday.me/bug/20190527/1166338.html