8wDlpd.png
8wDFp9.png
8wDEOx.png
8wDMfH.png
8wDKte.png

在最新的 Android 15 中获取位置的正确方法

Craftbeergal 2月前

57 0

我在 Android 应用中无法准确检索用户位置,尤其是在较新的 Android 版本中。我根据 Stack Overflow 上的答案实施了一个解决方案,但是...

我在 Android 应用中无法准确检索用户位置,尤其是在较新的 Android 版本中。我根据 Stack Overflow 答案 ,但效果不如预期。

我不确定问题的根本原因。是由于最近的 Android 版本中位置权限处理方式的变更、我的代码中的权限实现不正确,还是 Stack Overflow 解决方案本身存在潜在问题?

您能否指导我解决此问题应采取的具体步骤,包括检查与权限相关的问题、验证位置服务和调试我的代码?

我特别感兴趣的是了解如何在较新的 Android 版本上正确处理位置权限以及任何可能解决兼容性问题的方法。

帖子版权声明 1、本帖标题:在最新的 Android 15 中获取位置的正确方法
    本站网址:http://xjnalaquan.com/
2、本网站的资源部分来源于网络,如有侵权,请联系站长进行删除处理。
3、会员发帖仅代表会员个人观点,并不代表本站赞同其观点和对其真实性负责。
4、本站一律禁止以任何方式发布或转载任何违法的相关信息,访客发现请向站长举报
5、站长邮箱:yeweds@126.com 除非注明,本帖由Craftbeergal在本站《android》版块原创发布, 转载请注明出处!
最新回复 (0)
  • 我不认为这是这样做的正确地方,因为这里没有特别的问题。你要求的是完整的逻辑实现

  • 以下是我们在撰写时可以做到的方法

    val cameraPermissionState = rememberPermissionState(Manifest.permission.ACCESS_FINE_LOCATION)
    val requestPermissionLauncher = rememberLauncherForActivityResult(
        ActivityResultContracts.RequestPermission()
    ) { isGranted ->
        if (isGranted) {
            // Permission granted
            viewModel.fetchLocation()
        } else {
            // Handle permission denial
    
        }
    }
    LaunchedEffect(cameraPermissionState) {
        if (!cameraPermissionState.status.isGranted && cameraPermissionState.status.shouldShowRationale) {
            //Show rational dialog explaining why app want this permission
        } else {
            requestPermissionLauncher.launch(Manifest.permission.ACCESS_FINE_LOCATION)
        }
    }
    

    当然,我们必须像下面这样在清单中添加权限,否则它在这里也不会起作用。

    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
    

    以下是在 kotlin 中获取位置的主要逻辑

    fun fetchLocation(context: Context) {
        Log.d(TAG, "onLocationResult:TestLocation>>Searching")
        val fusedLocationClient = LocationServices.getFusedLocationProviderClient(context as Activity)
    
        val locationRequest = LocationRequest.Builder(Priority.PRIORITY_HIGH_ACCURACY, 10000)
            .setWaitForAccurateLocation(true)
            .setMinUpdateIntervalMillis(5000)
            .setMaxUpdateDelayMillis(15000)
            .build()
    
        var locationCallback: LocationCallback? = null
    
        locationCallback = object : LocationCallback() {
            override fun onLocationResult(locationResult: LocationResult) {
                for (location in locationResult.locations) {
                    // Handle the received location object
                    val latitude = location.latitude
                    val longitude = location.longitude
    
                    Log.d(TAG, "onLocationResult:TestLocation>>$latitude,$longitude")
                    locationCallback?.let {
                        fusedLocationClient.removeLocationUpdates(it)
                    }
                    // ... use the location data
                }
            }
        }
        fusedLocationClient.requestLocationUpdates(locationRequest, locationCallback, Looper.getMainLooper())
    }
    

    与旧式 xml java 相比,在 kotlin compose 中,它变得非常简单

  • 要在最新的 Android 15 中获取位置,您应该使用 Fused Location Provider API,它是 Google Play 服务的一部分。此 API 提供了一种简单有效的方法来获取设备的位置,具有高精度和低功耗。 步骤:

    1. 添加依赖项:将必要的依赖项添加到您的 build.gradle 文件:
    dependencies {
        implementation 'com.google.android.gms:play-services-location:21.0.1'
    }
    
    1. 请求权限:更新您的 AndroidManifest.xml 以包含必要的位置权限:
    XML
    
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
    
    1. 在运行时检查权限:确保在运行时检查并请求位置权限:
    Java
    
    if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED &&
        ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
        ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.ACCESS_COARSE_LOCATION}, LOCATION_REQUEST_CODE);
        return;
    }
    
    1. 初始化FusedLocationProviderClient:在您的活动中创建FusedLocationProviderClient的实例:
    Java
    
    private FusedLocationProviderClient fusedLocationClient;
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    
        fusedLocationClient = LocationServices.getFusedLocationProviderClient(this);
    }
    
    1. 获取最后已知位置:使用 getLastLocation 方法获取最后已知位置:
    Java
    
    fusedLocationClient.getLastLocation()
        .addOnSuccessListener(this, new OnSuccessListener<Location>() {
            @Override
            public void onSuccess(Location location) {
                // Got last known location. In some rare situations, this can be null.
                if (location != null) {
                    double latitude = location.getLatitude();
                    double longitude = location.getLongitude();
                    // Use the location data
                }
            }
        });
    
返回
作者最近主题: