Android: Как получить последнее известное местоположение в службе переднего плана?

#java #android

Вопрос:

Я хочу получать последнее известное местоположение в службе переднего плана каждый раз, когда мне это нужно. Существует код Kotlin, который отлично работает в соответствии с этим руководством. :

 private fun getlastknownlocation(){
    val client: FusedLocationProviderClient = LocationServices.getFusedLocationProviderClient(this)
    client.lastLocation
            .addOnSuccessListener { location : Location? ->

                // Got last known location. In some rare situations this can be null.
            }
}
 

Поэтому я хочу сделать то же самое с помощью java, и вот мой код:

 public class myService extends Service {

    private FusedLocationProviderClient fusedLocationClient;

    @Nullable
    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }

    @Override
    public void onCreate() {
        super.onCreate();
        fusedLocationClient = LocationServices.getFusedLocationProviderClient(this);
       ...
       ...
       ...
   void getLocation() {

        fusedLocationClient.getLastLocation()
                .addOnSuccessListener(WHATSHOULDBEHERE, new OnSuccessListener<Location>() {
                    @Override
                    public void onSuccess(Location location) {

                        // Got last known location. In some rare situations this can be null.
                        if (location != null) {
                           //

                        }
                    }
                });
    }
 

Так…

ЧТО БЫ ТАМ НИ БЫЛО

Я попробовал (Executor/Activity) getApplication() , (Executor/Activity) getApplicationContext() , (Executor) myService.this и получил эту ошибку:

androidx.multidex.MultiDexApplication/MyService не может быть преобразован в java.util.concurrent.Исполнитель

Как я могу получить последнее известное или даже текущее местоположение в службе переднего плана с помощью java? Обратите внимание, что я не хочу периодически отслеживать или получать данные о местоположении.

ОБНОВЛЕНИЕ: Я удалил первый параметр, и теперь я не получаю ошибок. Но все еще не могу определить местоположение. Я удивляюсь, что это возможно с помощью кода kotlin легко, и я не могу сделать это с помощью кода java. Вот мой код Котлина:

 @SuppressLint("MissingPermission")
private fun requestLocation() {
    val request = LocationRequest()
    request.numUpdates = 1
    request.priority = LocationRequest.PRIORITY_HIGH_ACCURACY
    val client: FusedLocationProviderClient = LocationServices.getFusedLocationProviderClient(this)

    client.requestLocationUpdates(request, object : LocationCallback() {
        override fun onLocationResult(locationResult: LocationResult) {
            val location: Location = locationResult.lastLocation
            if (location != null) {
                Log.i("Location Service", "location update $location")
            }
        }
    }, null)

}

@SuppressLint("MissingPermission")
private fun getlastknownlocation(){
    val client: FusedLocationProviderClient = LocationServices.getFusedLocationProviderClient(this)
    client.lastLocation
            .addOnSuccessListener { location : Location? ->
                Log.i("location11", location?.latitude.toString())
                Log.i("location11", location?.longitude.toString())

                // Got last known location. In some rare situations this can be null.
            }
}
 

и вот мой manifests.xml :

 <service
    android:name=".myService"
    android:foregroundServiceType="location"
    android:enabled="true"
    android:exported="true"
    android:stopWithTask="false" />
 

Комментарии:

1. Возможно, вы передадите пример Executor . Например, вы могли бы позвонить Executors.newSingleThreadExecutor() . Или удалите этот первый параметр и <a rel=»noreferrer noopener nofollow» href=»https://developers.google.com/android/reference/com/google/android/gms/tasks/Task#addOnSuccessListener(com.google.android.gms.tasks.OnSuccessListener)» rel=»nofollow noreferrer»> вызовите однопараметрическую версию addOnSuccessListener() .

2. @CommonsWare Спасибо. теперь ошибок нет, но я все еще не могу определить местоположение. Не могли бы вы, пожалуйста, ответить на вопрос с подробностями для получения местоположения (последнее известное и точное местоположение) в сервисе, чтобы я мог это принять.

3. ЧТО ТАМ БЫЛО? Ничего, вызовите тот же метод, который вы вызываете из Котлина, у которого есть только один аргумент. Обратите внимание, что ваш код Kotlin на самом деле вызывает Java API.

4. @m0skit0 ХОРОШО! пожалуйста, прочтите ОБНОВЛЕНИЕ. Я знаю, и я попытался декомпилировать байт-код kotlin в java-код, и я написал java-код на основе этого. Но все равно не сработало.