亚洲精品久久久中文字幕-亚洲精品久久片久久-亚洲精品久久青草-亚洲精品久久婷婷爱久久婷婷-亚洲精品久久午夜香蕉

您的位置:首頁技術(shù)文章
文章詳情頁

Android通過原生方式獲取經(jīng)緯度與城市信息的方法

瀏覽:2日期:2022-09-23 09:02:08

一、概述

在項(xiàng)目中需要獲取用戶所在位置的經(jīng)緯度和城市上送給風(fēng)控系統(tǒng)。一般來說,定位有兩種方式:

用第三方SDK定位,如百度地圖、高德地圖、谷歌地圖; 用Android原生SDK中的api定位;

本文講述定位的第二種方式--用Android原生的SDK中的api定位,如果項(xiàng)目定位要求較高還是建議使用第三方地圖庫。

二、Android原生SDK中的api定位

Android原生方式獲取經(jīng)緯度兩種定位方式:GPS定位和Wifi定位

GPS定位相比Wifi定位更精準(zhǔn)且可在無網(wǎng)絡(luò)情況下使用,但在室內(nèi)基本暴斃無法使用。 WiFi定位沒有室內(nèi)外限制,也不需要開啟GPS但需要聯(lián)網(wǎng)。但測試發(fā)現(xiàn)WiFi定位時(shí)onLocationChanged函數(shù)(用于監(jiān)聽經(jīng)緯度變化)觸發(fā)間隔無法小于30s。

示例代碼如下:

public class TestLocationActivity extends AppCompatActivity { public static final int LOCATION_CODE = 301; private LocationManager locationManager; private String locationProvider = null; @Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); getLocation(); } private void getLocation(){ //1.獲取位置管理器 locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE); //2.獲取位置提供器,GPS或是NetWork List<String> providers = locationManager.getProviders(true); if (providers.contains(LocationManager.GPS_PROVIDER)) { //如果是GPS locationProvider = LocationManager.GPS_PROVIDER; Log.v('TAG', '定位方式GPS'); } else if (providers.contains(LocationManager.NETWORK_PROVIDER)) { //如果是Network locationProvider = LocationManager.NETWORK_PROVIDER; Log.v('TAG', '定位方式Network'); }else { Toast.makeText(this, '沒有可用的位置提供器', Toast.LENGTH_SHORT).show(); return; } if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { //獲取權(quán)限(如果沒有開啟權(quán)限,會彈出對話框,詢問是否開啟權(quán)限) if (ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED || ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) { //請求權(quán)限 ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.ACCESS_COARSE_LOCATION}, LOCATION_CODE); } else { //3.獲取上次的位置,一般第一次運(yùn)行,此值為null Location location = locationManager.getLastKnownLocation(locationProvider); if (location!=null){ Toast.makeText(this, location.getLongitude() + ' ' + location.getLatitude() + '',Toast.LENGTH_SHORT).show(); Log.v('TAG', '獲取上次的位置-經(jīng)緯度:'+location.getLongitude()+' '+location.getLatitude()); getAddress(location); }else{ //監(jiān)視地理位置變化,第二個(gè)和第三個(gè)參數(shù)分別為更新的最短時(shí)間minTime和最短距離minDistace locationManager.requestLocationUpdates(locationProvider, 3000, 1,locationListener); } } } else { Location location = locationManager.getLastKnownLocation(locationProvider); if (location!=null){ Toast.makeText(this, location.getLongitude() + ' ' + location.getLatitude() + '', Toast.LENGTH_SHORT).show(); Log.v('TAG', '獲取上次的位置-經(jīng)緯度:'+location.getLongitude()+' '+location.getLatitude()); getAddress(location); }else{ //監(jiān)視地理位置變化,第二個(gè)和第三個(gè)參數(shù)分別為更新的最短時(shí)間minTime和最短距離minDistace locationManager.requestLocationUpdates(locationProvider, 3000, 1,locationListener); } } } public LocationListener locationListener = new LocationListener() { // Provider的狀態(tài)在可用、暫時(shí)不可用和無服務(wù)三個(gè)狀態(tài)直接切換時(shí)觸發(fā)此函數(shù) @Override public void onStatusChanged(String provider, int status, Bundle extras) { } // Provider被enable時(shí)觸發(fā)此函數(shù),比如GPS被打開 @Override public void onProviderEnabled(String provider) { } // Provider被disable時(shí)觸發(fā)此函數(shù),比如GPS被關(guān)閉 @Override public void onProviderDisabled(String provider) { } //當(dāng)坐標(biāo)改變時(shí)觸發(fā)此函數(shù),如果Provider傳進(jìn)相同的坐標(biāo),它就不會被觸發(fā) @Override public void onLocationChanged(Location location) { if (location != null) { //如果位置發(fā)生變化,重新顯示地理位置經(jīng)緯度 Toast.makeText(TestLocationActivity.this, location.getLongitude() + ' ' +location.getLatitude() + '', Toast.LENGTH_SHORT).show(); Log.v('TAG', '監(jiān)視地理位置變化-經(jīng)緯度:'+location.getLongitude()+' '+location.getLatitude()); } } }; @Override public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { switch (requestCode) { case LOCATION_CODE: if(grantResults.length > 0 && grantResults[0] == getPackageManager().PERMISSION_GRANTED && grantResults[1] == PackageManager.PERMISSION_GRANTED) { Toast.makeText(this, '申請權(quán)限', Toast.LENGTH_LONG).show(); try { List<String> providers = locationManager.getProviders(true); if (providers.contains(LocationManager.NETWORK_PROVIDER)) { //如果是Network locationProvider = LocationManager.NETWORK_PROVIDER; }else if (providers.contains(LocationManager.GPS_PROVIDER)) { //如果是GPS locationProvider = LocationManager.GPS_PROVIDER; } Location location = locationManager.getLastKnownLocation(locationProvider); if (location!=null){ Toast.makeText(this, location.getLongitude() + ' ' + location.getLatitude() + '', Toast.LENGTH_SHORT).show(); Log.v('TAG', '獲取上次的位置-經(jīng)緯度:'+location.getLongitude()+' '+location.getLatitude()); }else{ // 監(jiān)視地理位置變化,第二個(gè)和第三個(gè)參數(shù)分別為更新的最短時(shí)間minTime和最短距離minDistace locationManager.requestLocationUpdates(locationProvider, 0, 0,locationListener); } }catch (SecurityException e){ e.printStackTrace(); } } else { Toast.makeText(this, '缺少權(quán)限', Toast.LENGTH_LONG).show(); finish(); } break; } } //獲取地址信息:城市、街道等信息 private List<Address> getAddress(Location location) { List<Address> result = null; try { if (location != null) { Geocoder gc = new Geocoder(this, Locale.getDefault()); result = gc.getFromLocation(location.getLatitude(), location.getLongitude(), 1); Toast.makeText(this, '獲取地址信息:'+result.toString(), Toast.LENGTH_LONG).show(); Log.v('TAG', '獲取地址信息:'+result.toString()); } } catch (Exception e) { e.printStackTrace(); } return result; } @Override protected void onDestroy() { super.onDestroy(); locationManager.removeUpdates(locationListener); }}

在AndroidManifest.xml加權(quán)限

<!-- 粗略的位置權(quán)限 --><uses-permission android:name='android.permission.ACCESS_COARSE_LOCATION'></uses-permission> <!-- 精確的位置權(quán)限 --><uses-permission android:name='android.permission.ACCESS_FINE_LOCATION'></uses-permission><uses-permission android:name='android.permission.INTERNET'></uses-permission>

三、總結(jié)

首先將手機(jī)定位服務(wù)設(shè)置,調(diào)到下圖所示:

Android通過原生方式獲取經(jīng)緯度與城市信息的方法

這可能會獲取不到經(jīng)緯度。為什么在網(wǎng)絡(luò)和GPS都可用的情況下只執(zhí)行GPS而不是網(wǎng)絡(luò)?也許是從精確度考慮的,但是走GPS進(jìn)入監(jiān)聽的listener后,不會執(zhí)行onLocationChanged()方法,因?yàn)槲沂窃谑覂?nèi),沒有移動,所以如果你獲取不到經(jīng)緯度,就要將定位服務(wù)調(diào)到僅使用網(wǎng)絡(luò)定位或者關(guān)閉手機(jī)GPS這樣就可以獲取到了。

Android通過原生方式獲取經(jīng)緯度與城市信息的方法

總結(jié)

到此這篇關(guān)于Android通過原生方式獲取經(jīng)緯度與城市信息的文章就介紹到這了,更多相關(guān)Android原生獲取經(jīng)緯度與城市信息內(nèi)容請搜索好吧啦網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持好吧啦網(wǎng)!

標(biāo)簽: Android
相關(guān)文章:
主站蜘蛛池模板: 新香蕉视频在线 | 日本亚洲欧美 | 亚洲一卡二卡在线 | 久久精品三级 | 高清欧美一级在线观看 | 老外黑人欧美一级毛片 | 特级毛片8级毛片免费观看 特级毛片aaaaaa蜜桃 | 免费的毛片视频 | 久久草在线观看视频 | 国产手机在线小视频免费观看 | 免费在线黄色网址 | 天天看黄| 国产在线观看黄色 | 久久久亚洲 | 久久99影院网久久久久久 | 韩国免费高清一级毛片性色 | 欧美一级高清片欧美国产欧美 | 国产一区二区三区在线看片 | 亚洲20p| 在线观看视频黄色 | 亚洲夜色夜色综合网站 | 免费爱爱视频网站 | 91在线激情在线观看 | 十六一下岁女子毛片免费 | 蕾丝视频www在线观看 | 国产一区二区三区四区偷看 | 一级女人毛片人一女人 | 成人欧美一区二区三区在线 | 黄色一级片在线播放 | 久久这里只有精品免费播放 | 91tm视频| 色在线视频 | 欧美精品亚洲精品日韩1818 | 一级毛片一级毛片一级级毛片 | 国产成+人+综合+欧美 亚洲 | 成人精品视频在线观看 | 小明看看在线 | 成人免费午夜视频 | 91青青国产在线观看免费 | 欧美日韩一区二区综合 | 日本狠狠干 |