執行服務并初始化 mMap 的類:GoogleMap
class LocationServiceUser : Service(), OnMapReadyCallback {
private val serviceScopeUser = CoroutineScope(SupervisorJob() Dispatchers.IO)
private lateinit var locationClient: LocationClientUser
private val db = FirebaseFirestore.getInstance()
private lateinit var mMap: GoogleMap
private val markerOptions = MarkerOptions()
override fun onBind(p0: Intent?): IBinder? {
return null
}
override fun onCreate() {
super.onCreate()
locationClient = DefaultLocationClientUser(
applicationContext,
LocationServices.getFusedLocationProviderClient(applicationContext)
)
}
override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int {
when (intent?.action) {
ACTION_READING_DATA -> readingData()
}
return super.onStartCommand(intent, flags, startId)
}
override fun onMapReady(googleMap: GoogleMap) {
mMap = googleMap
}
fun readingData() {
locationClient.getLocation(5000L)
.catch { e -> e.printStackTrace() }
.onEach { location ->
var lat = location.latitude
var lng = location.longitude
var currentLatLng = LatLng(lat, lng)
db.collection("").document("")
.addSnapshotListener { documentUser, error ->
if (documentUser != null) {
lat = documentUser.getGeoPoint("localizacao")?.latitude!!
lng = documentUser.getGeoPoint("localizacao")?.longitude!!
Log.d(
"Response",
"Dado lido a cada 5s: lat: $lat, lng: $lng}"
)
currentLatLng = LatLng(lat, lng)
}
if (::mMap.isInitialized) {
mMap.addMarker(
MarkerOptions().position(currentLatLng)
.title("Minha Localizacao atual")
)
Log.d("Response", "Minha localizacao de agora: $currentLatLng")
}else{
Log.d("Response", "readingData: Erro ao inicializar o mMap")
}
markerOptions.position(currentLatLng)
mMap.addMarker(markerOptions)
mMap.moveCamera(CameraUpdateFactory.newLatLng(currentLatLng))
}
}.launchIn(serviceScopeUser)
}
override fun onDestroy() {
super.onDestroy()
serviceScopeUser.cancel()
}
companion object {
const val ACTION_READING_DATA = "ACTION_READING_DATA"
}
使用此服務類的片段
class UserFragment: Fragment() {
private var _binding: FragmentUserBinding? = null
private val binding: FragmentUserBinding get() = _binding!!
private lateinit var locationClientUser: LocationClientUser
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View {
_binding = FragmentUserBinding.inflate(inflater,container,false)
return binding.root
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
activity?.startService(Intent(context,LocationServices::class.java))
locationClientUser = DefaultLocationClientUser(
requireContext().applicationContext,
LocationServices.getFusedLocationProviderClient(requireContext().applicationContext)
)
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
binding.btnReadingData.setOnClickListener {
Intent(
requireContext().applicationContext,
LocationServiceUser::class.java
).apply {
action = LocationServiceUser.ACTION_READING_DATA
activity?.startService(this)
}
}
}
在服務中初始化 lateinit var mMap: GoogleMap 時出現問題,我知道在片段中啟動是正常的,但是我的服務具有我想要更新的 loc 資料。有沒有辦法在服務中初始化這個 lateinit var?
uj5u.com熱心網友回復:
mMap.addMarker(markerOptions)
mMap.moveCamera(CameraUpdateFactory.newLatLng(currentLatLng))
在此塊中添加這兩行
if (::mMap.isInitialized)
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/514743.html
標籤:爪哇安卓科特林谷歌地图
上一篇:洗掉谷歌地圖示簽
