Android 如何获取API 23在Kotlin的位置?
项目API要求:API 23+。 位置详细信息可用,适用于API 26+,但API 23不适用 我刚刚读了这篇文章 但是,他们尝试了不同的解决方案,仍然没有结果。原因可能是什么Android 如何获取API 23在Kotlin的位置?,android,kotlin,location,Android,Kotlin,Location,项目API要求:API 23+。 位置详细信息可用,适用于API 26+,但API 23不适用 我刚刚读了这篇文章 但是,他们尝试了不同的解决方案,仍然没有结果。原因可能是什么 class TabFragment1 : Fragment() { var lat: Double = 0.0 var long: Double = 0.0 override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(s
class TabFragment1 : Fragment() {
var lat: Double = 0.0
var long: Double = 0.0
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
activity?.let {}
}
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
super.onCreate(savedInstanceState)
val v: View = inflater.inflate(R.layout.fragment_tab1, container, false)
val spinner1 = v.spinnerCategory as Spinner
val buttonSearch = v.buttonSearch as Button
// Search button
buttonSearch.setOnClickListener {
// GET LOCATION
val g = this.activity?.let {
it1 -> geo(it1)
}
if (g != null) {
activity?.let {
if (g[0] == 0.0 && g[1] == 0.0) {
println(" g result ${g[0]}")
alert(getString(R.string.error_no_location))
// Request location updates
if (ActivityCompat.checkSelfPermission(it, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
var permissions = arrayOf(Manifest.permission.ACCESS_FINE_LOCATION)
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.Q) {
permissions = permissions.plus(android.Manifest.permission.ACCESS_BACKGROUND_LOCATION)
}
ActivityCompat.requestPermissions(context as Activity, permissions, 0)
}
} else {
// segue
val intent = Intent(it, PostTableViewActivity::class.java)
intent.putExtra("long", g[1].toString())
intent.putExtra("lat", g[0].toString())
startActivity(intent)
}
}
} else {
alert("TurnOn Geolocation!")
}
}
return v
}
geo.kt:
fun geo(context: Context): DoubleArray? {
val locationManager: LocationManager = context.getSystemService(Context.LOCATION_SERVICE) as LocationManager
val providers: List<String> = locationManager.getProviders(true)
var location: Location? = null
for (i in providers.size - 1 downTo 0) {
if (ActivityCompat.checkSelfPermission(context.applicationContext, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED
&& ActivityCompat.checkSelfPermission(context.applicationContext, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
println(" NO PERMS?? ")
var permissions = arrayOf(Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.ACCESS_COARSE_LOCATION)
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.Q) {
permissions = permissions.plus(android.Manifest.permission.ACCESS_BACKGROUND_LOCATION)
}
ActivityCompat.requestPermissions(context as Activity, permissions,0)
return null
}
location = locationManager.getLastKnownLocation(providers[i])
if (location != null)
break
}
val gps = DoubleArray(2)
if (location != null) {
println(" GEO FUNC has lat, long - ?? ${location.latitude}, ${location.longitude}")
gps[0] = location.latitude
gps[1] = location.longitude
}
return gps
}
fun geo(context:context):双数组?{
val locationManager:locationManager=context.getSystemService(context.LOCATION\u服务)作为locationManager
val providers:List=locationManager.getProviders(true)
变量位置:位置?=null
对于(providers.size中的i-1到0){
if(ActivityCompat.checkSelfPermission(context.applicationContext,Manifest.permission.ACCESS\u FINE\u LOCATION)!=PackageManager.permission\u已授予
&&ActivityCompat.checkSelfPermission(context.applicationContext,Manifest.permission.ACCESS\u rough\u LOCATION)!=PackageManager.permission\u已授予){
println(“无烫发”)
var permissions=arrayOf(Manifest.permission.ACCESS\u FINE\u LOCATION,Manifest.permission.ACCESS\u rough\u LOCATION)
if(android.os.Build.VERSION.SDK\u INT>=android.os.Build.VERSION\u code.Q){
权限=权限.plus(android.Manifest.permission.ACCESS\u BACKGROUND\u LOCATION)
}
ActivityCompat.requestPermissions(作为活动的上下文,权限,0)
返回空
}
location=locationManager.getLastKnownLocation(提供程序[i])
如果(位置!=null)
打破
}
val gps=双阵列(2)
如果(位置!=null){
println(“GEO-FUNC有lat,long-??${location.latitude},${location.longitude}”)
gps[0]=位置。纬度
gps[1]=位置。经度
}
返回gps
}
API 23控制台结果:
I/System.out:g结果0.0
API 26控制台结果:
I/System.out:GEO FUNC具有lat、long-??37.421998333335,-122.08400000000002
清单:
仅此项适用于API==23
1。build.gradle
implementation 'com.google.android.gms:play-services-location:17.1.0'
2。权限
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
3。上下文->gps[纬度、经度]
private fun requestCurrentLocation(context: Context): DoubleArray? {
val fusedLocationClient: FusedLocationProviderClient by lazy {
LocationServices.getFusedLocationProviderClient(context)
}
var cancellationTokenSource = CancellationTokenSource()
val gps = DoubleArray(2)
// Check Fine permission
if (ActivityCompat.checkSelfPermission(context, Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED) {
// Main code
val currentLocationTask: Task<Location> = fusedLocationClient.getCurrentLocation(
PRIORITY_HIGH_ACCURACY,
cancellationTokenSource.token
)
currentLocationTask.addOnCompleteListener { task: Task<Location> ->
val result = if (task.isSuccessful) {
val result: Location = task.result
gps[0] = result.latitude
gps[1] = result.longitude
"Location (success): ${result.latitude}, ${result.longitude}"
} else {
val exception = task.exception
"Location (failure): $exception"
}
println("getCurrentLocation() result: $result")
}
} else {
// Request fine location permission (full code below).
}
return gps
}
private-fun-requestCurrentLocation(上下文:上下文):双数组?{
val fusedLocationClient:FusedLocationProviderClient by lazy{
LocationServices.getFusedLocationProviderClient(上下文)
}
var cancellationTokenSource=cancellationTokenSource()
val gps=双阵列(2)
//检查罚款许可
if(ActivityCompat.checkSelfPermission(context、Manifest.permission.ACCESS\u FINE\u LOCATION)==PackageManager.permission\u已授予){
//主代码
val currentLocationTask:Task=fusedLocationClient.getCurrentLocation(
优先级高精度,
cancellationTokenSource.token
)
currentLocationTask.addOnCompleteListener{task:task->
val结果=如果(task.issusccessful){
val结果:位置=task.result
gps[0]=结果纬度
gps[1]=结果经度
位置(成功):${result.latitude},${result.longitude}
}否则{
val exception=task.exception
“位置(失败):$exception”
}
println(“getCurrentLocation()结果:$result”)
}
}否则{
//请求精细定位许可(完整代码如下)。
}
返回gps
}
getLastKnownLocation()
通常返回null
,您似乎没有做任何事情来请求位置更新。如果您想要有保证的位置,请不要使用getLastKnownLocation()
。使用诸如@commonware之类的方法。您知道如何清理设备上的缓存吗?(要重新启动并查看设备何时请求权限),您可以通过“系统设置”应用程序中的应用程序屏幕删除权限或清除数据。@Commonware未解析引用:requestSingleLocation。还有。。。getCurrentLocation()我应该使用它吗?你有例子吗?)对不起!这是评论中的一个输入错误,它是requestSingleUpdate()
。您可以单击原始注释中的链接来查看JavaDocsgetCurrentLocation()
也很好,但它仅在Android 11+上可用。演示getCurrentLocation()
。我不认为最近有一个示例显示了requestSingleUpdate()
。
private fun requestCurrentLocation(context: Context): DoubleArray? {
val fusedLocationClient: FusedLocationProviderClient by lazy {
LocationServices.getFusedLocationProviderClient(context)
}
var cancellationTokenSource = CancellationTokenSource()
val gps = DoubleArray(2)
// Check Fine permission
if (ActivityCompat.checkSelfPermission(context, Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED) {
// Main code
val currentLocationTask: Task<Location> = fusedLocationClient.getCurrentLocation(
PRIORITY_HIGH_ACCURACY,
cancellationTokenSource.token
)
currentLocationTask.addOnCompleteListener { task: Task<Location> ->
val result = if (task.isSuccessful) {
val result: Location = task.result
gps[0] = result.latitude
gps[1] = result.longitude
"Location (success): ${result.latitude}, ${result.longitude}"
} else {
val exception = task.exception
"Location (failure): $exception"
}
println("getCurrentLocation() result: $result")
}
} else {
// Request fine location permission (full code below).
}
return gps
}