您好,登錄后才能下訂單哦!
這篇文章主要講解了Android如何通過原生方式獲取經緯度與城市信息,內容清晰明了,對此有興趣的小伙伴可以學習一下,相信大家閱讀完之后會有幫助。
一、概述
在項目中需要獲取用戶所在位置的經緯度和城市上送給風控系統。一般來說,定位有兩種方式:
本文講述定位的第二種方式--用Android原生的SDK中的api定位,如果項目定位要求較高還是建議使用第三方地圖庫。
二、Android原生SDK中的api定位
Android原生方式獲取經緯度兩種定位方式:GPS定位和Wifi定位
示例代碼如下:
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) { //獲取權限(如果沒有開啟權限,會彈出對話框,詢問是否開啟權限) if (ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED || ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) { //請求權限 ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.ACCESS_COARSE_LOCATION}, LOCATION_CODE); } else { //3.獲取上次的位置,一般第一次運行,此值為null Location location = locationManager.getLastKnownLocation(locationProvider); if (location!=null){ Toast.makeText(this, location.getLongitude() + " " + location.getLatitude() + "",Toast.LENGTH_SHORT).show(); Log.v("TAG", "獲取上次的位置-經緯度:"+location.getLongitude()+" "+location.getLatitude()); getAddress(location); }else{ //監視地理位置變化,第二個和第三個參數分別為更新的最短時間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", "獲取上次的位置-經緯度:"+location.getLongitude()+" "+location.getLatitude()); getAddress(location); }else{ //監視地理位置變化,第二個和第三個參數分別為更新的最短時間minTime和最短距離minDistace locationManager.requestLocationUpdates(locationProvider, 3000, 1,locationListener); } } } public LocationListener locationListener = new LocationListener() { // Provider的狀態在可用、暫時不可用和無服務三個狀態直接切換時觸發此函數 @Override public void onStatusChanged(String provider, int status, Bundle extras) { } // Provider被enable時觸發此函數,比如GPS被打開 @Override public void onProviderEnabled(String provider) { } // Provider被disable時觸發此函數,比如GPS被關閉 @Override public void onProviderDisabled(String provider) { } //當坐標改變時觸發此函數,如果Provider傳進相同的坐標,它就不會被觸發 @Override public void onLocationChanged(Location location) { if (location != null) { //如果位置發生變化,重新顯示地理位置經緯度 Toast.makeText(TestLocationActivity.this, location.getLongitude() + " " + location.getLatitude() + "", Toast.LENGTH_SHORT).show(); Log.v("TAG", "監視地理位置變化-經緯度:"+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, "申請權限", 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", "獲取上次的位置-經緯度:"+location.getLongitude()+" "+location.getLatitude()); }else{ // 監視地理位置變化,第二個和第三個參數分別為更新的最短時間minTime和最短距離minDistace locationManager.requestLocationUpdates(locationProvider, 0, 0,locationListener); } }catch (SecurityException e){ e.printStackTrace(); } } else { Toast.makeText(this, "缺少權限", 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加權限
<!-- 粗略的位置權限 --> <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"></uses-permission> <!-- 精確的位置權限 --> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"></uses-permission> <uses-permission android:name="android.permission.INTERNET"></uses-permission>
三、總結
首先將手機定位服務設置,調到下圖所示:
這可能會獲取不到經緯度。為什么在網絡和GPS都可用的情況下只執行GPS而不是網絡?也許是從精確度考慮的,但是走GPS進入監聽的listener后,不會執行onLocationChanged()方法,因為我是在室內,沒有移動,所以如果你獲取不到經緯度,就要將定位服務調到僅使用網絡定位或者關閉手機GPS這樣就可以獲取到了。
看完上述內容,是不是對Android如何通過原生方式獲取經緯度與城市信息有進一步的了解,如果還想學習更多內容,歡迎關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。