最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

 更新時(shí)間:2020年07月30日 08:43:00   作者:SoarYuan  
這篇文章主要給大家介紹了關(guān)于Android通過原生方式獲取經(jīng)緯度與城市信息的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對各位Android開發(fā)者們具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧

一、概述

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

  1. 用第三方SDK定位,如百度地圖、高德地圖、谷歌地圖;
  2. 用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)限,會(huì)彈出對話框,詢問是否開啟權(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),它就不會(huì)被觸發(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)到下圖所示:

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

總結(jié)

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

相關(guān)文章

  • Android XML數(shù)據(jù)的三種解析方式

    Android XML數(shù)據(jù)的三種解析方式

    這篇文章主要為大家詳細(xì)介紹了Android XML數(shù)據(jù)的三種解析方式,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2016-11-11
  • 純android代碼實(shí)現(xiàn)九宮格手勢密碼

    純android代碼實(shí)現(xiàn)九宮格手勢密碼

    這篇文章主要為大家詳細(xì)介紹了純android代碼實(shí)現(xiàn)九宮格手勢密碼,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-07-07
  • 詳解Android 消息處理機(jī)制

    詳解Android 消息處理機(jī)制

    這篇文章主要介紹了Android 消息處理機(jī)制的相關(guān)資料,幫助大家更好的進(jìn)行Android開發(fā),感興趣的朋友可以了解下
    2020-10-10
  • Android編程實(shí)現(xiàn)XML解析與保存的三種方法詳解

    Android編程實(shí)現(xiàn)XML解析與保存的三種方法詳解

    這篇文章主要介紹了Android編程實(shí)現(xiàn)XML解析與保存的三種方法,結(jié)合實(shí)例形式詳細(xì)分析了Android實(shí)現(xiàn)xml解析的SAX、DOM、PULL三種方法的相關(guān)操作技巧,需要的朋友可以參考下
    2017-08-08
  • Android XmlPullParser 方式解析 Xml 文檔

    Android XmlPullParser 方式解析 Xml 文檔

    這篇文章主要介紹了Android XmlPullParser 方式解析 Xml 文檔的相關(guān)資料,需要的朋友可以參考下
    2017-06-06
  • Kotlin 中范圍操作符的使用示例代碼(范圍操作符不同用法)

    Kotlin 中范圍操作符的使用示例代碼(范圍操作符不同用法)

    Kotlin中的范圍操作符(in、step、downTo、until)在Android開發(fā)中非常實(shí)用,通過這些操作符,可以簡潔地遍歷整數(shù)范圍,實(shí)現(xiàn)各種遍歷需求,提高代碼的可讀性和可維護(hù)性,本文介紹Kotlin 中范圍操作符的使用示例,感興趣的朋友一起看看吧
    2025-03-03
  • Flutter 利用CustomScrollView實(shí)現(xiàn)滑動(dòng)效果

    Flutter 利用CustomScrollView實(shí)現(xiàn)滑動(dòng)效果

    我們可以使用ListView將幾個(gè)GridView組合在一起實(shí)現(xiàn)了不同可滑動(dòng)組件的粘合,但是這里必須要設(shè)置禁止 GridView 的滑動(dòng),防止多個(gè)滑動(dòng)組件的沖突。這種方式寫起來不太方便,事實(shí)上 Flutter 提供了 CustomScrollView 來粘合多個(gè)滑動(dòng)組件,并且可以實(shí)現(xiàn)更有趣的滑動(dòng)效果。
    2021-06-06
  • Android pcm轉(zhuǎn)wav格式方法

    Android pcm轉(zhuǎn)wav格式方法

    本篇文章主要給大家講述了在Android開發(fā)中將pcm格式轉(zhuǎn)wav格式的方法和代碼實(shí)例,需要的朋友跟著學(xué)習(xí)下吧。
    2017-12-12
  • 詳解Android 硬布局item的高級(jí)寫法

    詳解Android 硬布局item的高級(jí)寫法

    這篇文章主要介紹了詳解Android 硬布局item的高級(jí)寫法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-12-12
  • Android編程實(shí)現(xiàn)在adapter中進(jìn)行數(shù)據(jù)操作的方法

    Android編程實(shí)現(xiàn)在adapter中進(jìn)行數(shù)據(jù)操作的方法

    這篇文章主要介紹了Android編程實(shí)現(xiàn)在adapter中進(jìn)行數(shù)據(jù)操作的方法,結(jié)合實(shí)例形式分析了Android基于adapter操作數(shù)據(jù)的相關(guān)步驟與實(shí)現(xiàn)技巧,需要的朋友可以參考下
    2017-02-02

最新評論

嘉禾县| 获嘉县| 彩票| 北票市| 将乐县| 岳阳县| 东乡县| 潜江市| 清流县| 上饶市| 柳河县| 康乐县| 墨玉县| 乐业县| 平和县| 三江| 贡觉县| 成武县| 房山区| 志丹县| 正阳县| 东辽县| 重庆市| 金乡县| 肇州县| 丰原市| 江北区| 方正县| 十堰市| 民丰县| 教育| 金寨县| 沅陵县| 米林县| 新干县| 汉阴县| 博客| 抚松县| 古田县| 永泰县| 青岛市|