#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-код на основе этого. Но все равно не сработало.