該賞金過期2天。這個問題的答案有資格獲得 50聲望獎勵。 湯姆·瓊斯希望引起更多人對這個問題的關注。
對于我正在制作的應用程式,我需要獲取用戶的位置,然后將其顯示在地圖上。
為了實作這一點,我在下面的代碼中使用了 LocationServices.getFusedLocationProviderClient()。
當我在 addOnSuccessListener 中獲取位置值時,緯度和經度值由于某種原因為空,因此我收到 NullPointerException:
import android.Manifest
import android.annotation.SuppressLint
import android.location.Location
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import androidx.core.app.ActivityCompat
import com.google.android.gms.location.FusedLocationProviderClient
import com.google.android.gms.location.LocationServices
import com.google.android.gms.maps.CameraUpdateFactory
import com.google.android.gms.maps.GoogleMap
import com.google.android.gms.maps.OnMapReadyCallback
import com.google.android.gms.maps.SupportMapFragment
import com.google.android.gms.maps.model.LatLng
import com.google.android.gms.maps.model.MarkerOptions
import com.google.android.material.dialog.MaterialAlertDialogBuilder
import com.realtomjoney.mapsapp.databinding.ActivityMainBinding
import java.lang.NullPointerException
class MainActivity : AppCompatActivity(), OnMapReadyCallback {
private lateinit var binding: ActivityMainBinding
lateinit var myMap: GoogleMap
lateinit var fusedLocation: FusedLocationProviderClient
@SuppressLint("MissingPermission")
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = ActivityMainBinding.inflate(layoutInflater)
setContentView(binding.root)
ActivityCompat.requestPermissions(this, arrayOf(
Manifest.permission.ACCESS_FINE_LOCATION,
Manifest.permission.ACCESS_COARSE_LOCATION) , 100)
val mapFragment = supportFragmentManager
.findFragmentById(R.id.map) as SupportMapFragment
mapFragment.getMapAsync(this)
binding.button2.setOnClickListener {
fusedLocation = LocationServices.getFusedLocationProviderClient(this)
fusedLocation.lastLocation.addOnSuccessListener { location: Location? ->
val latLong = LatLng(location!!.latitude, location.longitude)
myMap.addMarker(MarkerOptions().position(latLong).title("Found Location"))
myMap.moveCamera(CameraUpdateFactory.newLatLngZoom(latLong, 10f))
}
}
}
override fun onMapReady(p0: GoogleMap) {
myMap = p0
}
}
當我運行該應用程式時,出現以下例外:
2021-10-19 16:46:09.859 8556-8556/com.realtomjoney.mapsapp E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.realtomjoney.mapsapp, PID: 8556
java.lang.NullPointerException
at com.realtomjoney.mapsapp.MainActivity.onCreate$lambda-1$lambda-0(MainActivity.kt:46)
at com.realtomjoney.mapsapp.MainActivity.$r8$lambda$wwcxhtPyugLtHLn65vCEt3JY33Q(Unknown Source:0)
at com.realtomjoney.mapsapp.MainActivity$$ExternalSyntheticLambda1.onSuccess(Unknown Source:4)
at com.google.android.gms.tasks.zzn.run(com.google.android.gms:play-services-tasks@@17.2.0:4)
at android.os.Handler.handleCallback(Handler.java:938)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loopOnce(Looper.java:201)
at android.os.Looper.loop(Looper.java:288)
at android.app.ActivityThread.main(ActivityThread.java:7842)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:548)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1003)
是的,當我第一次運行該應用程式時,我對所有權限都說“是”。
如果這個問題寫得不好或重復,請告訴我,因為我正在努力創建良好且結構良好的問題。
uj5u.com熱心網友回復:
出于多種原因,lastLocation 可以為空。它們在此處列出https://developer.android.com/training/location/retrieve-current#last-known
uj5u.com熱心網友回復:
首先,在初始化要映射的用戶坐標時不為空的正確程序是在活動或片段中的 onConnected() 回呼而不是 onCreate() 上初始化地圖,lastLocation 可以為空。
REQUEST_CODE_ASK_PERMISSIONS如果不使用位置觀察器,您可以使用它來處理回呼,位置觀察器基本上看起來像這樣
if (location.provider == LocationManager.GPS_PROVIDER) {
getData()
}
過去我有同樣的情況,我的代碼在權限回呼上是這樣的:
if (isGranted()) {
try {
fusedLocationProviderClient.lastLocation.addOnCompleteListener {
if (it.isSuccessful) {
if (it.result != null) {
setLocationData(it.result)
}
}
}
} catch (e: Exception) {
}
基本上在授予權限后,它會獲取您的位置,您可以選擇它是否要使用它來添加標記或其他任何東西。
uj5u.com熱心網友回復:
我也遇到過這個問題,尤其是當我第一次在設備上安裝我的應用程式時。有兩件事你可以嘗試,我認為會有所幫助:
一個是嘗試打開谷歌地圖應用程式并等待它得到修復,然后繼續打開您的應用程式。這應該為您的融合位置提供程式客戶端提供它可以查找的最后一個位置。檢查此答案以供參考
第二個是更進一步并使用提供程式請求位置更新。如果您只需要一個位置修復,則可以在獲得第一個位置后繼續并取消注冊。我正在為我的應用程式執行此操作,通常在安裝后第一次使用該應用程式時,最后一個位置僅為空。之后它通常有效。這可能是您無論如何都應該做的事情,因為您不能期望您的用戶在使用您的應用程式之前打開谷歌地圖。
為了安全起見,請注意,fusedlocationproviderclient當您的設備上有待處理的 Google 服務更新時,有時會停止作業或表現例外。因此,請繼續確保您的設備在這方面是最新的。
uj5u.com熱心網友回復:
我遇到過同樣的問題
- 檢查設備上的 GPS 是否已打開
- 可能是因為您使用的 google maps api 密鑰的計費問題有時檢查所有這些錯誤日志顯示 google maps 計費問題的問題
uj5u.com熱心網友回復:
看起來您請求權限(ActivityCompat.requestPermissions(...)) 但從未處理權限請求(您需要覆寫 onRequestPermissionsResult(...))。更多資訊:https : //developer.android.com/training/permissions/requesting#manage-request-code-yourself
或者你可以切換到新的方法讓系統管理請求代碼:https : //developer.android.com/training/permissions/requesting#allow-system-manage-request-code
最后一件事,在某些情況下 getLastLocation() 可以回傳 null,在這種情況下我呼叫 getCurrentLocation(),它總是回傳新的新設備位置,更多資訊在這里:https : //developer.android.com/training/location/retrieve-當前#BestEstimate
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/339850.html
