iT邦幫忙

2019 iT 邦幫忙鐵人賽

DAY 8
0
Software Development

英國研究顯示,連續30天用Kotlin開發Android將有益於身心健康系列 第 8

Android Kotlin 實作 Day 7_MyLocation(下)(GoogleMap相機、標記+SnackBar+定位服務)

<< 接續上篇

Method


Permission

  1. 在 AndroidManifest 中加入

    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
    
  2. 在 MainActivity 中請求權限

關於 Permission 及請求權限的方式請參考 Day 3 內容


SnackBar

在下方彈出提醒訊息

  • 要使用 Snackbar 需先在 build.gradle 中加入

    implementation 'com.android.support:design:28.0.0'
    
  • 基礎設定 SnackBar

    Snackbar.make(view: View, text: CharSequence, duration: Int).show()

    val thisView = window.decorView
    Snackbar.make(thisView, "無定位功能無法執行程序", Snackbar.LENGTH_INDEFINITE).show()
    

    window.decorView 在 Day 5 內容中有提過

    • make 方法:製造出 SnackBar

      make (view: View, text: CharSequence, duration: Int)

      • view:parent view

        SnackBar 是依附在 View 上的 view,因此需設置 parent view,
        也因此 SnackBar 的顯示會跟著 parent view 同進退。

        Toast 與 SnackBar 不同:
        Toast 為依附在 context 上,因此即便 App 不在螢幕畫面中,
        只要依附的 context 仍存在,Toast 仍會繼續彈出。

      • text:為要顯示的訊息內容

      • duration:SnackBar 顯示的時間,有三種

        • LENGTH_SHORT:短時間後自動關閉

        • LENGTH_LONG:長時間後自動關閉

        • LENGTH_INDEFINITE:一直顯示

          當有新的不同內容的 SnackBar 出現時被替換會關閉
          設置事件觸發 SnackBar 的 dismiss() 方法時會關閉

    • show():顯示呼叫此方法的物件

  • 為 SnackBar 設置動作及按鈕

    val snackBar = Snackbar.make(thisView, "無定位功能無法執行程序", Snackbar.LENGTH_INDEFINITE)
    snackBar.setAction("OK", object : View.OnClickListener {
     override fun onClick(v: View?) {
         snackBar.dismiss()
     }
    })
         .setActionTextColor(Color.LTGRAY)
         .show()
    
  • 可自定義 SnackBar 外觀、樣式:參考資料


GoogleMap

  • onMapReady

    此方法會在 Google Map 準備好時被調用

    因為我們要對地圖做的任何初始化設定都需在 Map 準備好時才能設定,
    因此對地圖的初始化設定將會寫在此方法中

    onMapReady 為 OnMapReadyCallback 這個 Interface 裡面的 abstract function
    因為我們需要調用這個方法,所以我們必須實例化這個 Interface 並實作 onMapReady 方法。
    從前面導入建立好的 Google Maps Activity 可以看到 Activity 實例化了這個 Interface

    val mMap : GoogleMap
    
    override fun onMapReady(googleMap: GoogleMap) {
        //取得準備好的 Map
        mMap = googleMap
        //自定義的 function,用來判斷並確定要用哪種定位
        //並且在起始位置加上 Marker
        locationManager()
        //Google Map 中顯示裝置位置,且裝置移動會跟著移動的那個藍點
        mMap.isMyLocationEnabled = true
    }
    
  • addMarker

    GoogleMap 的方法,用來加上標記

    addMarker (options: MarkerOptions)

    MarkerOptions:用來定義 Marker 如何呈現的物件類型

    mMap.addMarker(MarkerOptions().position(lntLng).title("Current Position"))
    

    MarkerOptions 中的方法:

  • animateCamera

    GoogleMap 的方法,用來設置 Map 的相機

    animateCamera (update: CameraUpdate)

    CameraUpdate:用來定義相機該如何變動的物件類型

    mMap.animateCamera(CameraUpdateFactory.newLatLngZoom(LatLng(location.latitude, location.longitude), 12.0f))
    
    • CameraUpdateFactory

      用產生 CameraUpdate 類型物件的類別

    • newLatLng 方法:移動相機中心

      newLatLng (latLng: LatLng )

      • latLng:新的相機中心的經緯度
    • newLatLngZoom 方法:移動相機中心及調整縮放級距

      newLatLngZoom (latLng: LatLng, zoom: float)

      • latLng:新的相機中心的經緯度

      • zoom:相機移動後要呈現的縮放級距

    • 更多的相機設定方法請參考上方 CameraUpdateFactory 的連結


LocationManager

用來取得系統定位服務

val locationManager = getSystemService(LOCATION_SERVICE) as LocationManager?

使用 Context 的 getSystemService 方法加入參數 LOCATION_SERVICE
獲取 LocationManager

  • isProviderEnabled 方法:

    用來確認定位服務是否可使用,會回傳 Boolean 值
    (使用者在設定中設為開啟就會為 True,反之為 False)

    isProviderEnabled (provider: String)

    • provider:定位服務提供者的名稱,如下

      var isGPSEnabled = locationManager!!.isProviderEnabled(LocationManager.GPS_PROVIDER)
      var isNetworkEnabled = locationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER)
    
  • requestLocationUpdates 方法

    用來註冊 LocationManager 要向哪個服務取得位置更新資訊

    requestLocationUpdates (provider: String,
                minTime: long,
                minDistance: float,
                listener: LocationListener)

    • provider:定位服務提供者的名稱

    • minTime:更新位置的最小時間間隔,單位為毫秒

    • minDistance:更新位置的最小距離間隔,單位為米

    • listener:每次位置更新的時候會從 LocationManager 接收通知的 LocationListener

    locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 0L, 0f, locationListener)
    
  • getLastKnownLocation

    用來獲取上一次紀錄的定位位置,會回傳上次紀錄的定位位置資訊

    getLastKnownLocation (provider:String)

    • provider:定位服務提供者的名稱

    • 在定位服務未開啟的時候也可執行此方法,會回傳 null

    • 有可能得到過期的位置資訊
      例如定位服務被開啟後關閉,接著裝置移動後又開啟的時候

    val oriLocation : Location
    oriLocation = locationManager.getLastKnownLocation(LocationManager.NETWORK_PROVIDER)
    

實作成果

查看詳細 Code > GitHub

tags: Android Kotlin Google Map Google Map Marker Google Map Camera SnackBar LocationManager

上一篇
Android Kotlin 實作 Day 7_MyLocation(上)(導入GoogleMap + API Key 取得及使用)
下一篇
Android Kotlin 實作 Day 8:BottomNavigation(上)(Fragment 生命週期與載入)
系列文
英國研究顯示,連續30天用Kotlin開發Android將有益於身心健康30

尚未有邦友留言

立即登入留言