日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > Android >内容正文

Android

基于安卓实现的模拟定位功能(Android)

發(fā)布時間:2023/12/10 Android 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 基于安卓实现的模拟定位功能(Android) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

源碼下載地址:https://download.csdn.net/download/sheziqiong/85628133

Android 實現(xiàn)模擬地圖定位功能

實現(xiàn)原理:

??手機定位方式目前有4種:基站定位,WIFI定位,GPS定位,AGPS定位。

??本工程利用手機自帶的"模擬位置"功能實現(xiàn)運行時修改LocationManager結(jié)果。
??原理:使用android自帶的調(diào)試api,模擬gps provider的結(jié)果。

??Android 6.0系統(tǒng)以下,可以通過Setting.Secure.ALLOW_MOCK_LOCATION獲取是否【允許模擬位置】,當【允許模擬位置】開啟時,可addTestProvider;

??Android 6.0系統(tǒng)及以上,棄用Setting.Secure.ALLOW_MOCK_LOCATION變量,沒有【允許模擬位置】選項,
增加【選擇模擬位置信息應用】,此時需要選擇當前應用,才可以addTestProvider,
但未找到獲取當前選擇應用的方法,因此通過addTestProvider是否成功來判斷是否可用模擬位置。

代碼分析:

MockLocationManager:模擬地址管理類
??首先通過Android系統(tǒng)模擬位置管理器LocationManager獲取系統(tǒng)模擬位置服務,Android 6.0以下,通過Setting.Secure.ALLOW_MOCK_LOCATION判斷是否可模擬位置,Android 6.0及以上,需要【選擇模擬位置信息應用】,未找到方法,因此通過addTestProvider是否可用判斷。

/*** 模擬位置是否啟用* 若啟用,則addTestProvider*/public boolean getUseMockPosition(Context context) {// Android 6.0以下,通過Setting.Secure.ALLOW_MOCK_LOCATION判斷// Android 6.0及以上,需要【選擇模擬位置信息應用】,未找到方法,因此通過addTestProvider是否可用判斷boolean canMockPosition = (Settings.Secure.getInt(context.getContentResolver(), Settings.Secure.ALLOW_MOCK_LOCATION, 0) != 0)|| Build.VERSION.SDK_INT > 22;if (canMockPosition && hasAddTestProvider == false) {try {for (String providerStr : mockProviders) {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 {if (providerStr.equals(LocationManager.GPS_PROVIDER)) {locationManager.addTestProvider(providerStr, true, true, false, false, true, true, true, Criteria.POWER_HIGH, Criteria.ACCURACY_FINE);} else if (providerStr.equals(LocationManager.NETWORK_PROVIDER)) {locationManager.addTestProvider(providerStr, true, false, true, false, false, false, false, Criteria.POWER_LOW, Criteria.ACCURACY_FINE);} else {locationManager.addTestProvider(providerStr, false, false, false, false, true, true, true, Criteria.POWER_LOW, Criteria.ACCURACY_FINE);}}locationManager.setTestProviderEnabled(providerStr, true);locationManager.setTestProviderStatus(providerStr, LocationProvider.AVAILABLE, null, System.currentTimeMillis());}hasAddTestProvider = true; // 模擬位置可用canMockPosition = true;} catch (SecurityException e) {canMockPosition = false;}}if (canMockPosition == false) {stopMockLocation();}return canMockPosition;} ```http://www.biyezuopin.vip   接下來設置模擬經(jīng)緯度數(shù)據(jù): ```java// 模擬位置(addTestProvider成功的前提下)for (String providerStr : mockProviders) {Location mockLocation = new Location(providerStr);mockLocation.setLatitude(latitude); // 維度(度)mockLocation.setLongitude(longitude); // 經(jīng)度(度)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);} ```http://www.biyezuopin.vip   取消模擬定位方法: ```java/*** 取消位置模擬,以免啟用模擬數(shù)據(jù)后無法還原使用系統(tǒng)位置* 若模擬位置未開啟,則removeTestProvider將會拋出異常;* 若已addTestProvider后,關(guān)閉模擬位置,未removeTestProvider將導致系統(tǒng)GPS無數(shù)據(jù)更新;*/public void stopMockLocation() {if (hasAddTestProvider) {for (String provider : mockProviders) {try {locationManager.removeTestProvider(provider);} catch (Exception ex) {// 此處不需要輸出日志,若未成功addTestProvider,則必然會出錯// 這里是對于非正常情況的預防措施}}hasAddTestProvider = false;}}

??注冊位置服務,獲取系統(tǒng)位置

// 注冊位置服務,獲取系統(tǒng)位置if (ActivityCompat.checkSelfPermission(context, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(context, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {// ActivityCompat#requestPermissions// here to request the missing permissions, and then overriding// public void onRequestPermissionsResult(int requestCode, String[] permissions,// int[] grantResults)// to handle the case where the user grants the permission. See the documentation// for ActivityCompat#requestPermissions for more details.return;}mockLocationManager.locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, locationListener);

??最后通過LocationListener.onLocationChanged()回調(diào)方法獲取GPS定位數(shù)據(jù):

private LocationListener locationListener = new LocationListener() {@Overridepublic void onLocationChanged(final Location location) {setLocationData(location);}@Overridepublic void onStatusChanged(String provider, int status, Bundle extras) {}@Overridepublic void onProviderEnabled(String provider) {}@Overridepublic void onProviderDisabled(String provider) {}};/*** 獲取到模擬定位信息,并顯示** @param location 定位信息*/private void setLocationData(Location location) {tvProvider.setText(location.getProvider());tvTime.setText(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date(location.getTime())));tvLatitude.setText(location.getLatitude() + " °");tvLongitude.setText(location.getLongitude() + " °");}

使用模擬定位需先開啟系統(tǒng)設置中的模擬位置:

  • Android 6.0 以下:【開發(fā)者選項 -> 允許模擬位置】

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

參考鏈接:

  • 1、【科普】GPS、Wifi等各種手機定位方式的含義及原理詳解
  • 2、Android 使用模擬位置(支持Android 6.0)
  • 3、http://www.biyezuopin.vip

源碼下載地址:https://download.csdn.net/download/sheziqiong/85628133

總結(jié)

以上是生活随笔為你收集整理的基于安卓实现的模拟定位功能(Android)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。