#android-studio #ionic-framework #ionic-native
#android-studio #ionic-framework #ionic-native
Вопрос:
Вот мой код, который регистрирует местоположение, но время обновления составляет 5 секунд, и я хочу сократить его примерно до 500 мс. приложение работает правильно, просто хочу сократить время
import { Component, NgZone } from '@angular/core';
import { Plugins } from '@capacitor/core';
const { Geolocation } = Plugins;
import { NativeGeocoder, NativeGeocoderResult, NativeGeocoderOptions } from '@ionic-native/native-geocoder/ngx';
@Component({
selector: 'app-tab3',
templateUrl: 'tab3.page.html',
styleUrls: ['tab3.page.scss']
})
export class Tab3Page {
public lat: any;
public lng: any;
points: any;
wait: any;
constructor(public ngZone: NgZone) {
this.points = [];
}
track() {
this.wait = Geolocation.watchPosition({}, (position, err) => {
this.ngZone.run(() => {
this.lat = position.coords.latitude;
this.lng = position.coords.longitude;
let date = new Date().toLocaleTimeString();
this.addNewLocation(position.coords.latitude, position.coords.longitude,date);
})
})
}
stopTracking() {
Geolocation.clearWatch({ id: this.wait });
}
addNewLocation(lat, lng, time) {
this.points.unshift({
lat,
lng,
time,
});
}
}
Комментарии:
1. Может кто-нибудь поделиться со мной, почему кто-то хотел бы посмотреть местоположение? Я не вижу сценария использования.
Ответ №1:
Пожалуйста, попробуйте использовать опцию тайм-аута:
Свойство PositionOptions.timeout — это положительное значение long, представляющее максимальный промежуток времени (в миллисекундах), который разрешено использовать устройству для возврата позиции. Значение по умолчанию равно Infinity, что означает, что getCurrentPosition() не вернется, пока позиция не будет доступна.
Вы можете использовать его следующим образом:
track() {
this.wait = Geolocation.watchPosition({ enableHighAccuracy: false, timeout: 500, maximumAge: 0 }, (position, err) => {
this.ngZone.run(() => {
this.lat = position.coords.latitude;
this.lng = position.coords.longitude;
let date = new Date().toLocaleTimeString();
this.addNewLocation(position.coords.latitude, position.coords.longitude,date);
})
})
}
Документы о конденсаторах также подтверждают, что это должно работать: https://capacitorjs.com/docs/apis/geolocation#type-162408
Если метод watchPosition не помогает вашему варианту использования, вы можете попробовать реализовать свой собственный метод «watch». К сожалению, у меня нет доступа к приложению с конденсатором, но что-то вроде приведенного ниже должно помочь вам на правильном пути:
import { Component, NgZone } from '@angular/core';
import { Plugins } from '@capacitor/core';
const { Geolocation } = Plugins;
import { NativeGeocoder, NativeGeocoderResult, NativeGeocoderOptions } from '@ionic-native/native-geocoder/ngx';
import { interval } from 'rxjs';
import { Subscription } from 'rxjs';
import { concatMap } from 'rxjs/operators';
@Component({
selector: 'app-tab3',
templateUrl: 'tab3.page.html',
styleUrls: ['tab3.page.scss']
})
export class Tab3Page {
private subscription: Subscription;
constructor(public ngZone: NgZone) {
}
track() {
const interval500 = interval(500);
this.subscription = interval500.pipe(
concatMap(val => Geolocation.getCurrentPosition())
).subscribe(coordinates => console.log(coordinates));
}
stopTracking() {
this.subscription.unsubscribe();
}
}
По сути, вам понадобится свой собственный интервал (500 мс), а затем вызывайте метод getCurrentPosition для каждого «тика» интервала. Затем отписывайтесь должным образом.
Это действительно не рекомендуется, так как это может вызвать проблемы с батареей и т. Д. Кроме того, устройство может быть не в состоянии по-прежнему предоставлять географические данные, если у него есть ограничение уровня устройства на количество обновлений.
В зависимости от варианта использования вы можете захотеть вместо этого «приблизить» географические данные с интервалом в 5 секунд.
Комментарии:
1. Я пробовал, но в Android время обновления все еще составляет 5 секунд. знаете ли вы причину этого?
2. Я вижу, это может быть ограничение, которое они накладывают на сторону устройства. Затем вы должны реализовать свой собственный метод «наблюдения» — в основном использовать rxjs и оператор интервалов и извлекать географические данные с помощью getCurrentPosition. Имейте в виду, что нажатие на него 2 раза в секунду может разрядить батарею. Я мог бы попытаться написать метод, который сделает это позже сегодня
3. сергей с нетерпением ждет вашего ответа …. я жду вашего положительного ответа с отличным кодом. спасибо, надеюсь, вы скоро вернетесь. скромная просьба помочь мне с вашим методом @SergeyRudenko
4. привет @anshul извините, у меня нет доступа к приложению Capacitor, чтобы даже подтвердить, что вышеупомянутое обновление будет работать. Кроме того, устройства могут иметь ограничение на уровне устройства на время обновления геопозиции. Но попробуйте и дайте мне знать.
5. @sergerrudenko ты проверил мой код, братан? я искал в Интернете и пробовал много способов, но все то же самое. пожалуйста, помогите мне