Android 如何获取API 23在Kotlin的位置?

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

项目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(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()
。您可以单击原始注释中的链接来查看JavaDocs
getCurrentLocation()
也很好,但它仅在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
}