Сравнить коммиты
| Автор | SHA1 | Дата | |
|---|---|---|---|
|
|
8adbc0f83c | ||
|
|
cd48c75257 | ||
|
|
4eacf30897 | ||
|
|
88cc37e96e | ||
|
|
b80fde0b6d | ||
|
|
f734d0256f | ||
|
|
1dcc26b47b | ||
|
|
5580f0b6bf | ||
|
|
ddf1f0fbe0 | ||
|
|
235e58d3e2 | ||
|
|
9cdb10db14 | ||
|
|
745a8523ef | ||
|
|
a2b2c215da | ||
|
|
6d1c7b47e1 | ||
|
|
10bc96caf9 | ||
|
|
0873aa7302 | ||
|
|
37d3584f77 | ||
|
|
404886f80e | ||
|
|
a68b489681 | ||
|
|
04e5b01cc7 | ||
|
|
5f059645a1 | ||
|
|
8b985526dd | ||
|
|
5e8ea134e0 | ||
|
|
ec85edd56f | ||
|
|
c5ab10919e | ||
|
|
3e8ba9a603 |
@@ -1,27 +1,84 @@
|
|||||||
# [Traccar Client for Android](https://www.traccar.org/client)
|
# traccar-client-android (форк)
|
||||||
|
|
||||||
[](https://play.google.com/store/apps/details?id=org.traccar.client) [](https://f-droid.org/repository/browse/?fdid=org.traccar.client)
|
Android-приложение Traccar Client — GPS-трекер, который снимает координаты устройства и отправляет их на сервер Traccar по протоколу OsmAnd (HTTP GET с параметрами). Работает фоновой службой, накапливает точки в локальной SQLite-очереди и досылает их при появлении сети.
|
||||||
|
|
||||||
## Overview
|
Форк сделан как резервная копия официального репозитория [traccar/traccar-client-android](https://github.com/traccar/traccar-client-android) (автор — Anton Tananaev) в самохостовом Gitea: приложение используется вместе со своим сервером Traccar, и наличие независимой копии исходников гарантирует возможность пересобрать APK даже без доступа к GitHub.
|
||||||
|
|
||||||
Traccar Client is an Android GPS tracking application. It can work with Traccar open source server software.
|
Документация оригинала (ссылки на Google Play/F-Droid, команда, лицензия Apache 2.0) сохранена в [README.upstream.md](README.upstream.md).
|
||||||
|
|
||||||
## Team
|
## Отличия от оригинала
|
||||||
|
|
||||||
- Anton Tananaev ([anton@traccar.org](mailto:anton@traccar.org))
|
Изменений нет. Все 438 коммитов принадлежат авторам оригинала (386 + 19 — Anton Tananaev, остальные — внешние контрибьюторы через pull request'ы). Собственных правок владельца форка в истории нет. Форк взят как резервная копия.
|
||||||
|
|
||||||
## License
|
## Стек
|
||||||
|
|
||||||
Apache License, Version 2.0
|
- Kotlin 1.8.0, Android SDK (compileSdk/targetSdk 33, minSdk 16)
|
||||||
|
- Gradle 7.5.1 + Android Gradle Plugin 7.4.1
|
||||||
|
- AndroidX: `core-ktx` 1.9.0, `preference-ktx` 1.2.0, `multidex` 2.0.1, Material Components 1.6.1
|
||||||
|
- `com.github.judemanutd:autostarter` 1.1.0 и `dev.doubledot.doki` — обход агрессивного энергосбережения вендоров (DKMA)
|
||||||
|
- Flavor `google`: Firebase BOM 28.2.1 (Analytics, Crashlytics), Play Services Location 21.0.1, Play Core
|
||||||
|
- SQLite (`SQLiteOpenHelper`) — буфер непереданных позиций
|
||||||
|
- Тесты: JUnit 4.13.2, Robolectric 4.7.3
|
||||||
|
- Локализация: Transifex (48 каталогов `values-*`)
|
||||||
|
|
||||||
Licensed under the Apache License, Version 2.0 (the "License");
|
## Структура
|
||||||
you may not use this file except in compliance with the License.
|
|
||||||
You may obtain a copy of the License at
|
|
||||||
|
|
||||||
http://www.apache.org/licenses/LICENSE-2.0
|
| Путь | Назначение |
|
||||||
|
|---|---|
|
||||||
|
| `app/src/main/java/org/traccar/client/MainActivity.kt`, `MainFragment.kt` | Экран настроек (PreferenceFragment), запуск/остановка трекинга, запрос разрешений на геолокацию и отключение энергосбережения |
|
||||||
|
| `app/src/main/java/org/traccar/client/TrackingService.kt`, `TrackingController.kt` | Foreground-служба и логика цикла: получить позицию → записать в БД → отправить → удалить |
|
||||||
|
| `app/src/main/java/org/traccar/client/PositionProvider.kt`, `AndroidPositionProvider.kt` | Источник координат на системном `LocationManager` |
|
||||||
|
| `app/src/{regular,google,hidden}/java/.../PositionProviderFactory.kt` | Выбор источника позиций по flavor: системный или Google Fused Location |
|
||||||
|
| `app/src/main/java/org/traccar/client/ProtocolFormatter.kt` | Формирование URL запроса к серверу (протокол OsmAnd) |
|
||||||
|
| `app/src/main/java/org/traccar/client/RequestManager.kt`, `NetworkManager.kt` | HTTP-отправка и отслеживание состояния сети |
|
||||||
|
| `app/src/main/java/org/traccar/client/DatabaseHelper.kt` | SQLite-очередь позиций |
|
||||||
|
| `app/src/main/java/org/traccar/client/AutostartReceiver.kt`, `BatteryOptimizationHelper.kt`, `WakefulBroadcastReceiver.kt` | Автозапуск после перезагрузки, wake lock, борьба с убийством процесса |
|
||||||
|
| `app/src/main/java/org/traccar/client/ShortcutActivity.kt`, `DialLaunchReceiver.kt` | Ярлыки старт/стоп и запуск по набору кода в звонилке |
|
||||||
|
| `app/src/main/java/org/traccar/client/StatusActivity.kt` | Журнал событий приложения |
|
||||||
|
| `app/src/main/res/xml/preferences.xml` | Описание всех пользовательских настроек |
|
||||||
|
| `app/src/main/res/xml/network_security_config.xml` | Разрешён HTTP-трафик, доверие пользовательским CA (для HTTPS-прокси) |
|
||||||
|
| `app/src/test/java/...` | Unit-тесты форматтера URL, БД и отправки запросов |
|
||||||
|
| `translate.py` | Выгрузка переводов из Transifex (проект `traccar`, ресурс `client`) в `res/values-*` |
|
||||||
|
| `.github/` | Только CONTRIBUTING, FUNDING и шаблоны issue. CI-workflow в репозитории нет |
|
||||||
|
|
||||||
Unless required by applicable law or agreed to in writing, software
|
## Как собрать/запустить
|
||||||
distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
```bash
|
||||||
See the License for the specific language governing permissions and
|
./gradlew assembleRegularDebug # сборка без сервисов Google
|
||||||
limitations under the License.
|
./gradlew assembleRegularRelease
|
||||||
|
./gradlew assembleGoogleRelease # вариант с Firebase и Fused Location
|
||||||
|
./gradlew assembleHiddenRelease # скрытый вариант (applicationId org.traccar.client.hidden)
|
||||||
|
./gradlew test # unit-тесты (JUnit + Robolectric)
|
||||||
|
```
|
||||||
|
|
||||||
|
Три product flavor'а: `regular` (по умолчанию), `google`, `hidden`. Для сборки `google`-варианта задача `copyJson` копирует `google-services.json` из внешнего каталога `../../environment/google-services/traccar-client-android.json` — этого каталога в репозитории нет, для своей сборки нужен собственный файл Firebase либо использование flavor `regular`.
|
||||||
|
|
||||||
|
Обновление переводов: `./translate.py -t <transifex_token>` (требуется пакет `transifex-python`).
|
||||||
|
|
||||||
|
## Конфигурация
|
||||||
|
|
||||||
|
Настройки задаются в самом приложении и хранятся в SharedPreferences (`app/src/main/res/xml/preferences.xml`):
|
||||||
|
|
||||||
|
| Ключ | Назначение |
|
||||||
|
|---|---|
|
||||||
|
| `status` | Переключатель «служба запущена» |
|
||||||
|
| `id` | Идентификатор устройства; генерируется автоматически при первом запуске, должен совпадать с идентификатором в Traccar |
|
||||||
|
| `url` | Адрес сервера, куда шлются позиции (http:// или https://) |
|
||||||
|
| `accuracy` | Точность: high / medium / low |
|
||||||
|
| `interval` | Период опроса, секунды (по умолчанию 300) |
|
||||||
|
| `distance` | Минимальное смещение для отправки, метры (0 — выключено) |
|
||||||
|
| `angle` | Минимальное изменение курса, градусы (0 — выключено) |
|
||||||
|
| `buffer` | Буферизация точек при отсутствии сети |
|
||||||
|
| `wakelock` | Удержание процессора |
|
||||||
|
|
||||||
|
Сборочные параметры: `applicationId org.traccar.client` (у flavor `hidden` — `org.traccar.client.hidden`), `versionCode 81`, `versionName 7.0`, `gradle.properties` содержит только `android.useAndroidX=true`.
|
||||||
|
|
||||||
|
Секретов в репозитории нет: ключи Firebase и токен Transifex в коде отсутствуют и подставляются извне.
|
||||||
|
|
||||||
|
## Состояние
|
||||||
|
|
||||||
|
Рабочий, но копия устаревшая: 438 коммитов, последний — 05.04.2023 (Anton Tananaev, «Non nullable fields»), версия приложения 7.0 (versionCode 81). Оригинальный проект с тех пор развивается дальше, форк с ним не синхронизировали. Собственных коммитов владельца форка нет, поэтому дата последней своей правки отсутствует.
|
||||||
|
|
||||||
|
## Что не доделано
|
||||||
|
|
||||||
|
Меток TODO/FIXME и заглушек в коде нет — это релизная версия официального приложения. Применительно к самому форку не хватает только синхронизации с upstream: копия отстаёт от оригинала более чем на три года.
|
||||||
|
|||||||
@@ -0,0 +1,27 @@
|
|||||||
|
# [Traccar Client for Android](https://www.traccar.org/client)
|
||||||
|
|
||||||
|
[](https://play.google.com/store/apps/details?id=org.traccar.client) [](https://f-droid.org/repository/browse/?fdid=org.traccar.client)
|
||||||
|
|
||||||
|
## Overview
|
||||||
|
|
||||||
|
Traccar Client is an Android GPS tracking application. It can work with Traccar open source server software.
|
||||||
|
|
||||||
|
## Team
|
||||||
|
|
||||||
|
- Anton Tananaev ([anton@traccar.org](mailto:anton@traccar.org))
|
||||||
|
|
||||||
|
## License
|
||||||
|
|
||||||
|
Apache License, Version 2.0
|
||||||
|
|
||||||
|
Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
you may not use this file except in compliance with the License.
|
||||||
|
You may obtain a copy of the License at
|
||||||
|
|
||||||
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing, software
|
||||||
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
See the License for the specific language governing permissions and
|
||||||
|
limitations under the License.
|
||||||
@@ -2,29 +2,23 @@ apply plugin: 'com.android.application'
|
|||||||
apply plugin: 'kotlin-android'
|
apply plugin: 'kotlin-android'
|
||||||
|
|
||||||
android {
|
android {
|
||||||
compileSdkVersion 31
|
compileSdkVersion 33
|
||||||
|
|
||||||
defaultConfig {
|
defaultConfig {
|
||||||
applicationId 'org.traccar.client'
|
applicationId 'org.traccar.client'
|
||||||
buildConfigField 'boolean', 'HIDDEN_APP', 'false'
|
buildConfigField 'boolean', 'HIDDEN_APP', 'false'
|
||||||
minSdkVersion 16
|
minSdkVersion 16
|
||||||
targetSdkVersion 31
|
targetSdkVersion 33
|
||||||
versionCode 75
|
versionCode 81
|
||||||
versionName '6.14'
|
versionName '7.0'
|
||||||
multiDexEnabled true
|
multiDexEnabled true
|
||||||
}
|
}
|
||||||
|
namespace 'org.traccar.client'
|
||||||
compileOptions {
|
|
||||||
sourceCompatibility JavaVersion.VERSION_1_8
|
|
||||||
targetCompatibility JavaVersion.VERSION_1_8
|
|
||||||
}
|
|
||||||
|
|
||||||
packagingOptions {
|
packagingOptions {
|
||||||
exclude 'META-INF/DEPENDENCIES'
|
resources {
|
||||||
|
excludes += ['META-INF/DEPENDENCIES']
|
||||||
}
|
}
|
||||||
|
|
||||||
lintOptions {
|
|
||||||
checkReleaseBuilds false
|
|
||||||
}
|
}
|
||||||
|
|
||||||
flavorDimensions 'default'
|
flavorDimensions 'default'
|
||||||
@@ -44,27 +38,29 @@ android {
|
|||||||
includeAndroidResources = true
|
includeAndroidResources = true
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
lint {
|
||||||
|
checkReleaseBuilds false
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
dependencies {
|
dependencies {
|
||||||
implementation 'com.google.android.material:material:1.5.0-alpha04'
|
implementation 'com.google.android.material:material:1.6.1' // wait for preference-ktx update
|
||||||
implementation 'androidx.multidex:multidex:2.0.1'
|
implementation 'androidx.multidex:multidex:2.0.1'
|
||||||
implementation 'androidx.preference:preference-ktx:1.1.1'
|
implementation 'androidx.preference:preference-ktx:1.2.0'
|
||||||
implementation 'androidx.test:core-ktx:1.4.0'
|
implementation 'androidx.core:core-ktx:1.9.0'
|
||||||
implementation 'androidx.core:core-ktx:1.6.0'
|
|
||||||
implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
|
implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
|
||||||
implementation 'com.github.judemanutd:autostarter:1.1.0'
|
implementation 'com.github.judemanutd:autostarter:1.1.0'
|
||||||
implementation('dev.doubledot.doki:library:0.0.1@aar') {
|
implementation('dev.doubledot.doki:library:0.0.1@aar') {
|
||||||
transitive = true
|
transitive = true
|
||||||
}
|
}
|
||||||
testImplementation 'junit:junit:4.13.2'
|
testImplementation 'junit:junit:4.13.2'
|
||||||
testImplementation 'org.robolectric:robolectric:4.6.1'
|
testImplementation 'org.robolectric:robolectric:4.7.3'
|
||||||
googleImplementation platform('com.google.firebase:firebase-bom:28.2.1')
|
googleImplementation platform('com.google.firebase:firebase-bom:28.2.1')
|
||||||
googleImplementation 'com.google.firebase:firebase-core'
|
googleImplementation 'com.google.firebase:firebase-core'
|
||||||
googleImplementation 'com.google.firebase:firebase-analytics'
|
googleImplementation 'com.google.firebase:firebase-analytics'
|
||||||
googleImplementation 'com.google.firebase:firebase-crashlytics'
|
googleImplementation 'com.google.firebase:firebase-crashlytics'
|
||||||
googleImplementation 'com.google.android.gms:play-services-location:18.0.0'
|
googleImplementation 'com.google.android.gms:play-services-location:21.0.1'
|
||||||
googleImplementation 'com.google.android.play:core:1.10.2'
|
googleImplementation 'com.google.android.play:core:1.10.3'
|
||||||
}
|
}
|
||||||
|
|
||||||
if (getGradle().getStartParameter().getTaskRequests().toString().contains('Google')) {
|
if (getGradle().getStartParameter().getTaskRequests().toString().contains('Google')) {
|
||||||
|
|||||||
@@ -30,7 +30,7 @@ class GooglePositionProvider(context: Context, listener: PositionListener) : Pos
|
|||||||
@Suppress("DEPRECATION", "MissingPermission")
|
@Suppress("DEPRECATION", "MissingPermission")
|
||||||
override fun startUpdates() {
|
override fun startUpdates() {
|
||||||
val locationRequest = LocationRequest()
|
val locationRequest = LocationRequest()
|
||||||
locationRequest.priority = getPriority(preferences.getString(MainFragment.KEY_ACCURACY,"medium"))
|
locationRequest.priority = getPriority(preferences.getString(MainFragment.KEY_ACCURACY, "medium"))
|
||||||
locationRequest.interval = if (distance > 0 || angle > 0) MINIMUM_INTERVAL else interval
|
locationRequest.interval = if (distance > 0 || angle > 0) MINIMUM_INTERVAL else interval
|
||||||
fusedLocationClient.requestLocationUpdates(locationRequest, locationCallback, Looper.getMainLooper())
|
fusedLocationClient.requestLocationUpdates(locationRequest, locationCallback, Looper.getMainLooper())
|
||||||
}
|
}
|
||||||
@@ -43,7 +43,7 @@ class GooglePositionProvider(context: Context, listener: PositionListener) : Pos
|
|||||||
override fun requestSingleLocation() {
|
override fun requestSingleLocation() {
|
||||||
fusedLocationClient.lastLocation.addOnSuccessListener { location ->
|
fusedLocationClient.lastLocation.addOnSuccessListener { location ->
|
||||||
if (location != null) {
|
if (location != null) {
|
||||||
listener.onPositionUpdate(Position(deviceId, location, getBatteryLevel(context)))
|
listener.onPositionUpdate(Position(deviceId, location, getBatteryStatus(context)))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,15 @@
|
|||||||
|
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
android:width="108dp"
|
||||||
|
android:height="108dp"
|
||||||
|
android:viewportWidth="24"
|
||||||
|
android:viewportHeight="24"
|
||||||
|
android:tint="#333333">
|
||||||
|
<group android:scaleX="0.58"
|
||||||
|
android:scaleY="0.58"
|
||||||
|
android:translateX="5.04"
|
||||||
|
android:translateY="5.04">
|
||||||
|
<path
|
||||||
|
android:fillColor="@android:color/white"
|
||||||
|
android:pathData="M19.14,12.94c0.04,-0.3 0.06,-0.61 0.06,-0.94c0,-0.32 -0.02,-0.64 -0.07,-0.94l2.03,-1.58c0.18,-0.14 0.23,-0.41 0.12,-0.61l-1.92,-3.32c-0.12,-0.22 -0.37,-0.29 -0.59,-0.22l-2.39,0.96c-0.5,-0.38 -1.03,-0.7 -1.62,-0.94L14.4,2.81c-0.04,-0.24 -0.24,-0.41 -0.48,-0.41h-3.84c-0.24,0 -0.43,0.17 -0.47,0.41L9.25,5.35C8.66,5.59 8.12,5.92 7.63,6.29L5.24,5.33c-0.22,-0.08 -0.47,0 -0.59,0.22L2.74,8.87C2.62,9.08 2.66,9.34 2.86,9.48l2.03,1.58C4.84,11.36 4.8,11.69 4.8,12s0.02,0.64 0.07,0.94l-2.03,1.58c-0.18,0.14 -0.23,0.41 -0.12,0.61l1.92,3.32c0.12,0.22 0.37,0.29 0.59,0.22l2.39,-0.96c0.5,0.38 1.03,0.7 1.62,0.94l0.36,2.54c0.05,0.24 0.24,0.41 0.48,0.41h3.84c0.24,0 0.44,-0.17 0.47,-0.41l0.36,-2.54c0.59,-0.24 1.13,-0.56 1.62,-0.94l2.39,0.96c0.22,0.08 0.47,0 0.59,-0.22l1.92,-3.32c0.12,-0.22 0.07,-0.47 -0.12,-0.61L19.14,12.94zM12,15.6c-1.98,0 -3.6,-1.62 -3.6,-3.6s1.62,-3.6 3.6,-3.6s3.6,1.62 3.6,3.6S13.98,15.6 12,15.6z"/>
|
||||||
|
</group>
|
||||||
|
</vector>
|
||||||
@@ -1,5 +1,6 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
|
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
|
||||||
<background android:drawable="@color/light"/>
|
<background android:drawable="@android:color/white"/>
|
||||||
<foreground android:drawable="@mipmap/ic_launcher_foreground"/>
|
<foreground android:drawable="@drawable/ic_launcher_foreground"/>
|
||||||
|
<monochrome android:drawable="@drawable/ic_launcher_foreground"/>
|
||||||
</adaptive-icon>
|
</adaptive-icon>
|
||||||
@@ -1,5 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
|
||||||
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
|
|
||||||
<background android:drawable="@color/light"/>
|
|
||||||
<foreground android:drawable="@mipmap/ic_launcher_foreground"/>
|
|
||||||
</adaptive-icon>
|
|
||||||
|
До Ширина: | Высота: | Размер: 3.3 KiB После Ширина: | Высота: | Размер: 3.5 KiB |
|
До Ширина: | Высота: | Размер: 2.0 KiB |
|
До Ширина: | Высота: | Размер: 2.1 KiB После Ширина: | Высота: | Размер: 2.2 KiB |
|
До Ширина: | Высота: | Размер: 1.2 KiB |
|
До Ширина: | Высота: | Размер: 4.7 KiB После Ширина: | Высота: | Размер: 5.1 KiB |
|
До Ширина: | Высота: | Размер: 2.5 KiB |
|
До Ширина: | Высота: | Размер: 7.6 KiB После Ширина: | Высота: | Размер: 8.2 KiB |
|
До Ширина: | Высота: | Размер: 4.7 KiB |
|
До Ширина: | Высота: | Размер: 11 KiB После Ширина: | Высота: | Размер: 12 KiB |
|
До Ширина: | Высота: | Размер: 4.4 KiB |
@@ -1,11 +1,11 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<manifest
|
<manifest
|
||||||
xmlns:android="http://schemas.android.com/apk/res/android"
|
xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
xmlns:tools="http://schemas.android.com/tools"
|
xmlns:tools="http://schemas.android.com/tools">
|
||||||
package="org.traccar.client">
|
|
||||||
|
|
||||||
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
|
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
|
||||||
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
|
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
|
||||||
|
<uses-permission android:name="android.permission.ACCESS_BACKGROUND_LOCATION" />
|
||||||
<uses-permission android:name="android.permission.INTERNET" />
|
<uses-permission android:name="android.permission.INTERNET" />
|
||||||
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
|
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
|
||||||
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
|
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
|
||||||
@@ -26,7 +26,7 @@
|
|||||||
android:label="@string/app_name"
|
android:label="@string/app_name"
|
||||||
android:theme="@style/AppTheme"
|
android:theme="@style/AppTheme"
|
||||||
android:name=".MainApplication"
|
android:name=".MainApplication"
|
||||||
tools:ignore="GoogleAppIndexingWarning">
|
tools:ignore="GoogleAppIndexingWarning,UnusedAttribute">
|
||||||
|
|
||||||
<meta-data
|
<meta-data
|
||||||
android:name="google_analytics_adid_collection_enabled"
|
android:name="google_analytics_adid_collection_enabled"
|
||||||
@@ -59,7 +59,9 @@
|
|||||||
android:exported="true"
|
android:exported="true"
|
||||||
android:label="@string/menu_shortcuts">
|
android:label="@string/menu_shortcuts">
|
||||||
<intent-filter>
|
<intent-filter>
|
||||||
<action android:name="android.intent.action.MAIN" />
|
<action android:name="android.intent.action.VIEW" />
|
||||||
|
</intent-filter>
|
||||||
|
<intent-filter>
|
||||||
<action android:name="android.intent.action.CREATE_SHORTCUT" />
|
<action android:name="android.intent.action.CREATE_SHORTCUT" />
|
||||||
</intent-filter>
|
</intent-filter>
|
||||||
</activity>
|
</activity>
|
||||||
|
|||||||
|
После Ширина: | Высота: | Размер: 21 KiB |
|
До Ширина: | Высота: | Размер: 26 KiB |
@@ -47,11 +47,11 @@ class AndroidPositionProvider(context: Context, listener: PositionListener) : Po
|
|||||||
try {
|
try {
|
||||||
val location = locationManager.getLastKnownLocation(LocationManager.PASSIVE_PROVIDER)
|
val location = locationManager.getLastKnownLocation(LocationManager.PASSIVE_PROVIDER)
|
||||||
if (location != null) {
|
if (location != null) {
|
||||||
listener.onPositionUpdate(Position(deviceId, location, getBatteryLevel(context)))
|
listener.onPositionUpdate(Position(deviceId, location, getBatteryStatus(context)))
|
||||||
} else {
|
} else {
|
||||||
locationManager.requestSingleUpdate(provider, object : LocationListener {
|
locationManager.requestSingleUpdate(provider, object : LocationListener {
|
||||||
override fun onLocationChanged(location: Location) {
|
override fun onLocationChanged(location: Location) {
|
||||||
listener.onPositionUpdate(Position(deviceId, location, getBatteryLevel(context)))
|
listener.onPositionUpdate(Position(deviceId, location, getBatteryStatus(context)))
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun onStatusChanged(provider: String, status: Int, extras: Bundle) {}
|
override fun onStatusChanged(provider: String, status: Int, extras: Bundle) {}
|
||||||
|
|||||||
@@ -66,7 +66,7 @@ class BatteryOptimizationHelper {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fun requestException(context: Context) {
|
fun requestException(context: Context): Boolean {
|
||||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
|
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
|
||||||
val sharedPreferences = PreferenceManager.getDefaultSharedPreferences(context)
|
val sharedPreferences = PreferenceManager.getDefaultSharedPreferences(context)
|
||||||
if (!sharedPreferences.getBoolean(KEY_EXCEPTION_REQUESTED, false)) {
|
if (!sharedPreferences.getBoolean(KEY_EXCEPTION_REQUESTED, false)) {
|
||||||
@@ -80,15 +80,19 @@ class BatteryOptimizationHelper {
|
|||||||
requestVendorException(context)
|
requestVendorException(context)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
return true
|
||||||
}
|
}
|
||||||
} else if (!sharedPreferences.getBoolean(KEY_AUTOSTART_REQUESTED, false)) {
|
} else if (!sharedPreferences.getBoolean(KEY_AUTOSTART_REQUESTED, false)) {
|
||||||
sharedPreferences.edit().putBoolean(KEY_AUTOSTART_REQUESTED, true).apply()
|
sharedPreferences.edit().putBoolean(KEY_AUTOSTART_REQUESTED, true).apply()
|
||||||
try {
|
try {
|
||||||
AutoStartPermissionHelper.getInstance().getAutoStartPermission(context)
|
if (AutoStartPermissionHelper.getInstance().getAutoStartPermission(context)) {
|
||||||
|
return true
|
||||||
|
}
|
||||||
} catch (e: SecurityException) {
|
} catch (e: SecurityException) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
return false
|
||||||
}
|
}
|
||||||
|
|
||||||
companion object {
|
companion object {
|
||||||
|
|||||||
@@ -0,0 +1,21 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2022 Anton Tananaev (anton@traccar.org)
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
package org.traccar.client
|
||||||
|
|
||||||
|
data class BatteryStatus(
|
||||||
|
val level: Double = 0.0,
|
||||||
|
val charging: Boolean = false,
|
||||||
|
)
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright 2015 - 2021 Anton Tananaev (anton@traccar.org)
|
* Copyright 2015 - 2022 Anton Tananaev (anton@traccar.org)
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
@@ -16,6 +16,7 @@
|
|||||||
@file:Suppress("DEPRECATION", "StaticFieldLeak")
|
@file:Suppress("DEPRECATION", "StaticFieldLeak")
|
||||||
package org.traccar.client
|
package org.traccar.client
|
||||||
|
|
||||||
|
import android.annotation.SuppressLint
|
||||||
import android.content.ContentValues
|
import android.content.ContentValues
|
||||||
import android.content.Context
|
import android.content.Context
|
||||||
import android.database.SQLException
|
import android.database.SQLException
|
||||||
@@ -65,6 +66,7 @@ class DatabaseHelper(context: Context?) : SQLiteOpenHelper(context, DATABASE_NAM
|
|||||||
"course REAL," +
|
"course REAL," +
|
||||||
"accuracy REAL," +
|
"accuracy REAL," +
|
||||||
"battery REAL," +
|
"battery REAL," +
|
||||||
|
"charging INTEGER," +
|
||||||
"mock INTEGER)"
|
"mock INTEGER)"
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
@@ -90,6 +92,7 @@ class DatabaseHelper(context: Context?) : SQLiteOpenHelper(context, DATABASE_NAM
|
|||||||
values.put("course", position.course)
|
values.put("course", position.course)
|
||||||
values.put("accuracy", position.accuracy)
|
values.put("accuracy", position.accuracy)
|
||||||
values.put("battery", position.battery)
|
values.put("battery", position.battery)
|
||||||
|
values.put("charging", if (position.charging) 1 else 0)
|
||||||
values.put("mock", if (position.mock) 1 else 0)
|
values.put("mock", if (position.mock) 1 else 0)
|
||||||
db.insertOrThrow("position", null, values)
|
db.insertOrThrow("position", null, values)
|
||||||
}
|
}
|
||||||
@@ -102,6 +105,7 @@ class DatabaseHelper(context: Context?) : SQLiteOpenHelper(context, DATABASE_NAM
|
|||||||
}.execute()
|
}.execute()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@SuppressLint("Range")
|
||||||
fun selectPosition(): Position? {
|
fun selectPosition(): Position? {
|
||||||
db.rawQuery("SELECT * FROM position ORDER BY id LIMIT 1", null).use { cursor ->
|
db.rawQuery("SELECT * FROM position ORDER BY id LIMIT 1", null).use { cursor ->
|
||||||
if (cursor.count > 0) {
|
if (cursor.count > 0) {
|
||||||
@@ -117,6 +121,7 @@ class DatabaseHelper(context: Context?) : SQLiteOpenHelper(context, DATABASE_NAM
|
|||||||
course = cursor.getDouble(cursor.getColumnIndex("course")),
|
course = cursor.getDouble(cursor.getColumnIndex("course")),
|
||||||
accuracy = cursor.getDouble(cursor.getColumnIndex("accuracy")),
|
accuracy = cursor.getDouble(cursor.getColumnIndex("accuracy")),
|
||||||
battery = cursor.getDouble(cursor.getColumnIndex("battery")),
|
battery = cursor.getDouble(cursor.getColumnIndex("battery")),
|
||||||
|
charging = cursor.getInt(cursor.getColumnIndex("charging")) > 0,
|
||||||
mock = cursor.getInt(cursor.getColumnIndex("mock")) > 0,
|
mock = cursor.getInt(cursor.getColumnIndex("mock")) > 0,
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
@@ -147,7 +152,7 @@ class DatabaseHelper(context: Context?) : SQLiteOpenHelper(context, DATABASE_NAM
|
|||||||
}
|
}
|
||||||
|
|
||||||
companion object {
|
companion object {
|
||||||
const val DATABASE_VERSION = 3
|
const val DATABASE_VERSION = 4
|
||||||
const val DATABASE_NAME = "traccar.db"
|
const val DATABASE_NAME = "traccar.db"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright 2012 - 2021 Anton Tananaev (anton@traccar.org)
|
* Copyright 2012 - 2022 Anton Tananaev (anton@traccar.org)
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
@@ -54,6 +54,7 @@ class MainFragment : PreferenceFragmentCompat(), OnSharedPreferenceChangeListene
|
|||||||
private lateinit var sharedPreferences: SharedPreferences
|
private lateinit var sharedPreferences: SharedPreferences
|
||||||
private lateinit var alarmManager: AlarmManager
|
private lateinit var alarmManager: AlarmManager
|
||||||
private lateinit var alarmIntent: PendingIntent
|
private lateinit var alarmIntent: PendingIntent
|
||||||
|
private var requestingPermissions: Boolean = false
|
||||||
|
|
||||||
@SuppressLint("UnspecifiedImmutableFlag")
|
@SuppressLint("UnspecifiedImmutableFlag")
|
||||||
override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) {
|
override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) {
|
||||||
@@ -61,7 +62,7 @@ class MainFragment : PreferenceFragmentCompat(), OnSharedPreferenceChangeListene
|
|||||||
removeLauncherIcon()
|
removeLauncherIcon()
|
||||||
}
|
}
|
||||||
setHasOptionsMenu(true)
|
setHasOptionsMenu(true)
|
||||||
sharedPreferences = PreferenceManager.getDefaultSharedPreferences(context)
|
sharedPreferences = PreferenceManager.getDefaultSharedPreferences(requireContext())
|
||||||
setPreferencesFromResource(R.xml.preferences, rootKey)
|
setPreferencesFromResource(R.xml.preferences, rootKey)
|
||||||
initPreferences()
|
initPreferences()
|
||||||
|
|
||||||
@@ -95,9 +96,9 @@ class MainFragment : PreferenceFragmentCompat(), OnSharedPreferenceChangeListene
|
|||||||
originalIntent.addFlags(Intent.FLAG_RECEIVER_FOREGROUND)
|
originalIntent.addFlags(Intent.FLAG_RECEIVER_FOREGROUND)
|
||||||
|
|
||||||
val flags = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {
|
val flags = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {
|
||||||
PendingIntent.FLAG_MUTABLE
|
PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_MUTABLE
|
||||||
} else {
|
} else {
|
||||||
0
|
PendingIntent.FLAG_UPDATE_CURRENT
|
||||||
}
|
}
|
||||||
alarmIntent = PendingIntent.getBroadcast(activity, 0, originalIntent, flags)
|
alarmIntent = PendingIntent.getBroadcast(activity, 0, originalIntent, flags)
|
||||||
|
|
||||||
@@ -125,6 +126,7 @@ class MainFragment : PreferenceFragmentCompat(), OnSharedPreferenceChangeListene
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Suppress("DEPRECATION")
|
||||||
override fun onDisplayPreferenceDialog(preference: Preference) {
|
override fun onDisplayPreferenceDialog(preference: Preference) {
|
||||||
if (listOf(KEY_INTERVAL, KEY_DISTANCE, KEY_ANGLE).contains(preference.key)) {
|
if (listOf(KEY_INTERVAL, KEY_DISTANCE, KEY_ANGLE).contains(preference.key)) {
|
||||||
val f: EditTextPreferenceDialogFragmentCompat =
|
val f: EditTextPreferenceDialogFragmentCompat =
|
||||||
@@ -154,6 +156,13 @@ class MainFragment : PreferenceFragmentCompat(), OnSharedPreferenceChangeListene
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
override fun onStart() {
|
||||||
|
super.onStart()
|
||||||
|
if (requestingPermissions) {
|
||||||
|
requestingPermissions = BatteryOptimizationHelper().requestException(requireContext())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
override fun onResume() {
|
override fun onResume() {
|
||||||
super.onResume()
|
super.onResume()
|
||||||
sharedPreferences.registerOnSharedPreferenceChangeListener(this)
|
sharedPreferences.registerOnSharedPreferenceChangeListener(this)
|
||||||
@@ -205,7 +214,7 @@ class MainFragment : PreferenceFragmentCompat(), OnSharedPreferenceChangeListene
|
|||||||
}
|
}
|
||||||
|
|
||||||
private fun initPreferences() {
|
private fun initPreferences() {
|
||||||
PreferenceManager.setDefaultValues(activity, R.xml.preferences, false)
|
PreferenceManager.setDefaultValues(requireActivity(), R.xml.preferences, false)
|
||||||
if (!sharedPreferences.contains(KEY_DEVICE)) {
|
if (!sharedPreferences.contains(KEY_DEVICE)) {
|
||||||
val id = (Random().nextInt(900000) + 100000).toString()
|
val id = (Random().nextInt(900000) + 100000).toString()
|
||||||
sharedPreferences.edit().putString(KEY_DEVICE, id).apply()
|
sharedPreferences.edit().putString(KEY_DEVICE, id).apply()
|
||||||
@@ -214,6 +223,19 @@ class MainFragment : PreferenceFragmentCompat(), OnSharedPreferenceChangeListene
|
|||||||
findPreference<Preference>(KEY_DEVICE)?.summary = sharedPreferences.getString(KEY_DEVICE, null)
|
findPreference<Preference>(KEY_DEVICE)?.summary = sharedPreferences.getString(KEY_DEVICE, null)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private fun showBackgroundLocationDialog(context: Context, onSuccess: () -> Unit) {
|
||||||
|
val builder = AlertDialog.Builder(context)
|
||||||
|
val option = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
|
||||||
|
context.packageManager.backgroundPermissionOptionLabel
|
||||||
|
} else {
|
||||||
|
context.getString(R.string.request_background_option)
|
||||||
|
}
|
||||||
|
builder.setMessage(context.getString(R.string.request_background, option))
|
||||||
|
builder.setPositiveButton(android.R.string.ok) { _, _ -> onSuccess() }
|
||||||
|
builder.setNegativeButton(android.R.string.cancel, null)
|
||||||
|
builder.show()
|
||||||
|
}
|
||||||
|
|
||||||
private fun startTrackingService(checkPermission: Boolean, initialPermission: Boolean) {
|
private fun startTrackingService(checkPermission: Boolean, initialPermission: Boolean) {
|
||||||
var permission = initialPermission
|
var permission = initialPermission
|
||||||
if (checkPermission) {
|
if (checkPermission) {
|
||||||
@@ -224,10 +246,7 @@ class MainFragment : PreferenceFragmentCompat(), OnSharedPreferenceChangeListene
|
|||||||
permission = requiredPermissions.isEmpty()
|
permission = requiredPermissions.isEmpty()
|
||||||
if (!permission) {
|
if (!permission) {
|
||||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
|
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
|
||||||
requestPermissions(
|
requestPermissions(requiredPermissions.toTypedArray(), PERMISSIONS_REQUEST_LOCATION)
|
||||||
requiredPermissions.toTypedArray(),
|
|
||||||
PERMISSIONS_REQUEST_LOCATION
|
|
||||||
)
|
|
||||||
}
|
}
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
@@ -235,11 +254,22 @@ class MainFragment : PreferenceFragmentCompat(), OnSharedPreferenceChangeListene
|
|||||||
if (permission) {
|
if (permission) {
|
||||||
setPreferencesEnabled(false)
|
setPreferencesEnabled(false)
|
||||||
ContextCompat.startForegroundService(requireContext(), Intent(activity, TrackingService::class.java))
|
ContextCompat.startForegroundService(requireContext(), Intent(activity, TrackingService::class.java))
|
||||||
|
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.S) {
|
||||||
alarmManager.setInexactRepeating(
|
alarmManager.setInexactRepeating(
|
||||||
AlarmManager.ELAPSED_REALTIME_WAKEUP,
|
AlarmManager.ELAPSED_REALTIME_WAKEUP,
|
||||||
ALARM_MANAGER_INTERVAL.toLong(), ALARM_MANAGER_INTERVAL.toLong(), alarmIntent
|
ALARM_MANAGER_INTERVAL.toLong(), ALARM_MANAGER_INTERVAL.toLong(), alarmIntent
|
||||||
)
|
)
|
||||||
BatteryOptimizationHelper().requestException(requireContext())
|
}
|
||||||
|
|
||||||
|
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q
|
||||||
|
&& ContextCompat.checkSelfPermission(requireContext(), Manifest.permission.ACCESS_BACKGROUND_LOCATION) != PackageManager.PERMISSION_GRANTED) {
|
||||||
|
requestingPermissions = true
|
||||||
|
showBackgroundLocationDialog(requireContext()) {
|
||||||
|
requestPermissions(arrayOf(Manifest.permission.ACCESS_BACKGROUND_LOCATION), PERMISSIONS_REQUEST_BACKGROUND_LOCATION)
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
requestingPermissions = BatteryOptimizationHelper().requestException(requireContext())
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
sharedPreferences.edit().putBoolean(KEY_STATUS, false).apply()
|
sharedPreferences.edit().putBoolean(KEY_STATUS, false).apply()
|
||||||
val preference = findPreference<TwoStatePreference>(KEY_STATUS)
|
val preference = findPreference<TwoStatePreference>(KEY_STATUS)
|
||||||
@@ -248,7 +278,9 @@ class MainFragment : PreferenceFragmentCompat(), OnSharedPreferenceChangeListene
|
|||||||
}
|
}
|
||||||
|
|
||||||
private fun stopTrackingService() {
|
private fun stopTrackingService() {
|
||||||
|
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.S) {
|
||||||
alarmManager.cancel(alarmIntent)
|
alarmManager.cancel(alarmIntent)
|
||||||
|
}
|
||||||
requireActivity().stopService(Intent(activity, TrackingService::class.java))
|
requireActivity().stopService(Intent(activity, TrackingService::class.java))
|
||||||
setPreferencesEnabled(true)
|
setPreferencesEnabled(true)
|
||||||
}
|
}
|
||||||
@@ -292,6 +324,7 @@ class MainFragment : PreferenceFragmentCompat(), OnSharedPreferenceChangeListene
|
|||||||
const val KEY_BUFFER = "buffer"
|
const val KEY_BUFFER = "buffer"
|
||||||
const val KEY_WAKELOCK = "wakelock"
|
const val KEY_WAKELOCK = "wakelock"
|
||||||
private const val PERMISSIONS_REQUEST_LOCATION = 2
|
private const val PERMISSIONS_REQUEST_LOCATION = 2
|
||||||
|
private const val PERMISSIONS_REQUEST_BACKGROUND_LOCATION = 3
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright 2015 - 2021 Anton Tananaev (anton@traccar.org)
|
* Copyright 2015 - 2022 Anton Tananaev (anton@traccar.org)
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
@@ -31,19 +31,39 @@ data class Position(
|
|||||||
val course: Double = 0.0,
|
val course: Double = 0.0,
|
||||||
val accuracy: Double = 0.0,
|
val accuracy: Double = 0.0,
|
||||||
val battery: Double = 0.0,
|
val battery: Double = 0.0,
|
||||||
|
val charging: Boolean = false,
|
||||||
val mock: Boolean = false,
|
val mock: Boolean = false,
|
||||||
) {
|
) {
|
||||||
|
|
||||||
constructor(deviceId: String, location: Location, battery: Double) : this(
|
constructor(deviceId: String, location: Location, battery: BatteryStatus) : this(
|
||||||
deviceId = deviceId,
|
deviceId = deviceId,
|
||||||
time = Date(location.time),
|
time = Date(location.time.correctRollover()),
|
||||||
latitude = location.latitude,
|
latitude = location.latitude,
|
||||||
longitude = location.longitude,
|
longitude = location.longitude,
|
||||||
altitude = location.altitude,
|
altitude = location.altitude,
|
||||||
speed = location.speed * 1.943844, // speed in knots
|
speed = location.speed * 1.943844, // speed in knots
|
||||||
course = location.bearing.toDouble(),
|
course = location.bearing.toDouble(),
|
||||||
accuracy = if (location.provider != null && location.provider != LocationManager.GPS_PROVIDER) location.accuracy.toDouble() else 0.0,
|
accuracy = if (location.provider != null && location.provider != LocationManager.GPS_PROVIDER) {
|
||||||
battery = battery,
|
location.accuracy.toDouble()
|
||||||
mock = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR2) location.isFromMockProvider else false,
|
} else {
|
||||||
|
0.0
|
||||||
|
},
|
||||||
|
battery = battery.level,
|
||||||
|
charging = battery.charging,
|
||||||
|
mock = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {
|
||||||
|
location.isMock
|
||||||
|
} else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR2) {
|
||||||
|
@Suppress("DEPRECATION")
|
||||||
|
location.isFromMockProvider
|
||||||
|
} else {
|
||||||
|
false
|
||||||
|
},
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private const val rolloverDate = 1554508800000L // April 6, 2019
|
||||||
|
private const val rolloverOffset = 619315200000L // 1024 weeks
|
||||||
|
|
||||||
|
private fun Long.correctRollover(): Long {
|
||||||
|
return if (this < rolloverDate) this + rolloverOffset else this
|
||||||
|
}
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright 2013 - 2021 Anton Tananaev (anton@traccar.org)
|
* Copyright 2013 - 2022 Anton Tananaev (anton@traccar.org)
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
@@ -47,27 +47,32 @@ abstract class PositionProvider(
|
|||||||
abstract fun requestSingleLocation()
|
abstract fun requestSingleLocation()
|
||||||
|
|
||||||
protected fun processLocation(location: Location?) {
|
protected fun processLocation(location: Location?) {
|
||||||
|
val lastLocation = this.lastLocation
|
||||||
if (location != null &&
|
if (location != null &&
|
||||||
(lastLocation == null || location.time - lastLocation!!.time >= interval || distance > 0
|
(lastLocation == null || location.time - lastLocation.time >= interval || distance > 0
|
||||||
&& location.distanceTo(lastLocation) >= distance || angle > 0
|
&& location.distanceTo(lastLocation) >= distance || angle > 0
|
||||||
&& abs(location.bearing - lastLocation!!.bearing) >= angle)
|
&& abs(location.bearing - lastLocation.bearing) >= angle)
|
||||||
) {
|
) {
|
||||||
Log.i(TAG, "location new")
|
Log.i(TAG, "location new")
|
||||||
lastLocation = location
|
this.lastLocation = location
|
||||||
listener.onPositionUpdate(Position(deviceId, location, getBatteryLevel(context)))
|
listener.onPositionUpdate(Position(deviceId, location, getBatteryStatus(context)))
|
||||||
} else {
|
} else {
|
||||||
Log.i(TAG, if (location != null) "location ignored" else "location nil")
|
Log.i(TAG, if (location != null) "location ignored" else "location nil")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
protected fun getBatteryLevel(context: Context): Double {
|
protected fun getBatteryStatus(context: Context): BatteryStatus {
|
||||||
val batteryIntent = context.registerReceiver(null, IntentFilter(Intent.ACTION_BATTERY_CHANGED))
|
val batteryIntent = context.registerReceiver(null, IntentFilter(Intent.ACTION_BATTERY_CHANGED))
|
||||||
if (batteryIntent != null) {
|
if (batteryIntent != null) {
|
||||||
val level = batteryIntent.getIntExtra(BatteryManager.EXTRA_LEVEL, 0)
|
val level = batteryIntent.getIntExtra(BatteryManager.EXTRA_LEVEL, 0)
|
||||||
val scale = batteryIntent.getIntExtra(BatteryManager.EXTRA_SCALE, 1)
|
val scale = batteryIntent.getIntExtra(BatteryManager.EXTRA_SCALE, 1)
|
||||||
return level * 100.0 / scale
|
val status = batteryIntent.getIntExtra(BatteryManager.EXTRA_STATUS, -1)
|
||||||
|
return BatteryStatus(
|
||||||
|
level = level * 100.0 / scale,
|
||||||
|
charging = status == BatteryManager.BATTERY_STATUS_CHARGING || status == BatteryManager.BATTERY_STATUS_FULL,
|
||||||
|
)
|
||||||
}
|
}
|
||||||
return 0.0
|
return BatteryStatus()
|
||||||
}
|
}
|
||||||
|
|
||||||
companion object {
|
companion object {
|
||||||
|
|||||||
@@ -31,6 +31,9 @@ object ProtocolFormatter {
|
|||||||
.appendQueryParameter("altitude", position.altitude.toString())
|
.appendQueryParameter("altitude", position.altitude.toString())
|
||||||
.appendQueryParameter("accuracy", position.accuracy.toString())
|
.appendQueryParameter("accuracy", position.accuracy.toString())
|
||||||
.appendQueryParameter("batt", position.battery.toString())
|
.appendQueryParameter("batt", position.battery.toString())
|
||||||
|
if (position.charging) {
|
||||||
|
builder.appendQueryParameter("charge", position.charging.toString())
|
||||||
|
}
|
||||||
if (position.mock) {
|
if (position.mock) {
|
||||||
builder.appendQueryParameter("mock", position.mock.toString())
|
builder.appendQueryParameter("mock", position.mock.toString())
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -57,11 +57,10 @@ class TrackingService : Service() {
|
|||||||
|
|
||||||
@SuppressLint("WakelockTimeout")
|
@SuppressLint("WakelockTimeout")
|
||||||
override fun onCreate() {
|
override fun onCreate() {
|
||||||
|
startForeground(NOTIFICATION_ID, createNotification(this))
|
||||||
Log.i(TAG, "service create")
|
Log.i(TAG, "service create")
|
||||||
|
|
||||||
sendBroadcast(Intent(ACTION_STARTED))
|
sendBroadcast(Intent(ACTION_STARTED))
|
||||||
StatusActivity.addMessage(getString(R.string.status_service_create))
|
StatusActivity.addMessage(getString(R.string.status_service_create))
|
||||||
startForeground(NOTIFICATION_ID, createNotification(this))
|
|
||||||
|
|
||||||
if (ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED) {
|
if (ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED) {
|
||||||
if (PreferenceManager.getDefaultSharedPreferences(this).getBoolean(MainFragment.KEY_WAKELOCK, true)) {
|
if (PreferenceManager.getDefaultSharedPreferences(this).getBoolean(MainFragment.KEY_WAKELOCK, true)) {
|
||||||
@@ -89,10 +88,10 @@ class TrackingService : Service() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
override fun onDestroy() {
|
override fun onDestroy() {
|
||||||
|
stopForeground(true)
|
||||||
Log.i(TAG, "service destroy")
|
Log.i(TAG, "service destroy")
|
||||||
sendBroadcast(Intent(ACTION_STOPPED))
|
sendBroadcast(Intent(ACTION_STOPPED))
|
||||||
StatusActivity.addMessage(getString(R.string.status_service_destroy))
|
StatusActivity.addMessage(getString(R.string.status_service_destroy))
|
||||||
stopForeground(true)
|
|
||||||
if (wakeLock?.isHeld == true) {
|
if (wakeLock?.isHeld == true) {
|
||||||
wakeLock?.release()
|
wakeLock?.release()
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,15 @@
|
|||||||
|
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
android:width="108dp"
|
||||||
|
android:height="108dp"
|
||||||
|
android:viewportWidth="64"
|
||||||
|
android:viewportHeight="64">
|
||||||
|
<group android:scaleX="0.71"
|
||||||
|
android:scaleY="0.71"
|
||||||
|
android:translateX="9.28"
|
||||||
|
android:translateY="9.28">
|
||||||
|
<path
|
||||||
|
android:pathData="m32.459,10.617c-3.783,-0.085 -7.636,0.834 -11.152,2.865 -10.228,5.906 -13.731,18.983 -7.826,29.211 5.906,10.228 18.983,13.731 29.211,7.826 10.228,-5.906 13.733,-18.983 7.828,-29.211 -3.875,-6.712 -10.839,-10.529 -18.061,-10.691zM40.778,19.38c1.737,1.331 3.242,2.997 4.404,5.01 1.162,2.013 1.854,4.15 2.137,6.319l-3.804,0.547c-0.223,-1.679 -0.73,-3.405 -1.629,-4.964 -0.9,-1.559 -2.139,-2.86 -3.482,-3.892zM36.188,25.461c0.948,0.734 1.766,1.632 2.402,2.734 0.636,1.102 1.003,2.258 1.165,3.446l-3.803,0.549c-0.101,-0.699 -0.284,-1.445 -0.658,-2.093 -0.374,-0.648 -0.928,-1.179 -1.483,-1.615l2.377,-3.019zM21.601,29.215 L25.407,35.806 29.213,42.398a7.611,7.611 0,0 1,-7.612 0,7.611 7.611,0 0,1 -3.806,-6.592 7.611,7.611 0,0 1,3.806 -6.591zM30.306,31.049a1.903,1.903 0,0 1,1.693 0.951,1.903 1.903,0 0,1 -0.697,2.599 1.903,1.903 0,0 1,-2.599 -0.695,1.903 1.903,0 0,1 0.697,-2.601 1.903,1.903 0,0 1,0.906 -0.254z"
|
||||||
|
android:strokeWidth=".84379"
|
||||||
|
android:fillColor="#2e7d32"/>
|
||||||
|
</group>
|
||||||
|
</vector>
|
||||||
@@ -0,0 +1,15 @@
|
|||||||
|
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
android:width="108dp"
|
||||||
|
android:height="108dp"
|
||||||
|
android:viewportWidth="24"
|
||||||
|
android:viewportHeight="24"
|
||||||
|
android:tint="#2E7D32">
|
||||||
|
<group android:scaleX="0.58"
|
||||||
|
android:scaleY="0.58"
|
||||||
|
android:translateX="5.04"
|
||||||
|
android:translateY="5.04">
|
||||||
|
<path
|
||||||
|
android:fillColor="@android:color/white"
|
||||||
|
android:pathData="M12,2C6.48,2 2,6.48 2,12s4.48,10 10,10 10,-4.48 10,-10S17.52,2 12,2zM13,17h-2v-2h2v2zM13,13h-2L11,7h2v6z"/>
|
||||||
|
</group>
|
||||||
|
</vector>
|
||||||
@@ -0,0 +1,15 @@
|
|||||||
|
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
android:width="108dp"
|
||||||
|
android:height="108dp"
|
||||||
|
android:viewportWidth="24"
|
||||||
|
android:viewportHeight="24"
|
||||||
|
android:tint="#2E7D32">
|
||||||
|
<group android:scaleX="0.58"
|
||||||
|
android:scaleY="0.58"
|
||||||
|
android:translateX="5.04"
|
||||||
|
android:translateY="5.04">
|
||||||
|
<path
|
||||||
|
android:fillColor="@android:color/white"
|
||||||
|
android:pathData="M12,2C6.48,2 2,6.48 2,12s4.48,10 10,10s10,-4.48 10,-10S17.52,2 12,2zM9.5,16.5v-9l7,4.5L9.5,16.5z"/>
|
||||||
|
</group>
|
||||||
|
</vector>
|
||||||
@@ -0,0 +1,15 @@
|
|||||||
|
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
android:width="108dp"
|
||||||
|
android:height="108dp"
|
||||||
|
android:viewportWidth="24"
|
||||||
|
android:viewportHeight="24"
|
||||||
|
android:tint="#2E7D32">
|
||||||
|
<group android:scaleX="0.58"
|
||||||
|
android:scaleY="0.58"
|
||||||
|
android:translateX="5.04"
|
||||||
|
android:translateY="5.04">
|
||||||
|
<path
|
||||||
|
android:fillColor="@android:color/white"
|
||||||
|
android:pathData="M12,2C6.48,2 2,6.48 2,12s4.48,10 10,10s10,-4.48 10,-10S17.52,2 12,2zM11,16H9V8h2V16zM15,16h-2V8h2V16z"/>
|
||||||
|
</group>
|
||||||
|
</vector>
|
||||||
@@ -1,5 +1,6 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
|
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
|
||||||
<background android:drawable="@color/primary"/>
|
<background android:drawable="@android:color/white"/>
|
||||||
<foreground android:drawable="@mipmap/ic_launcher_foreground"/>
|
<foreground android:drawable="@drawable/ic_launcher_foreground"/>
|
||||||
|
<monochrome android:drawable="@drawable/ic_launcher_foreground"/>
|
||||||
</adaptive-icon>
|
</adaptive-icon>
|
||||||
@@ -1,5 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
|
||||||
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
|
|
||||||
<background android:drawable="@color/primary"/>
|
|
||||||
<foreground android:drawable="@mipmap/ic_launcher_foreground"/>
|
|
||||||
</adaptive-icon>
|
|
||||||
@@ -1,5 +1,6 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
|
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
|
||||||
<background android:drawable="@color/light"/>
|
<background android:drawable="@android:color/white"/>
|
||||||
<foreground android:drawable="@mipmap/ic_sos_foreground"/>
|
<foreground android:drawable="@drawable/ic_sos_foreground"/>
|
||||||
|
<monochrome android:drawable="@drawable/ic_sos_foreground"/>
|
||||||
</adaptive-icon>
|
</adaptive-icon>
|
||||||
@@ -1,5 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
|
||||||
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
|
|
||||||
<background android:drawable="@color/light"/>
|
|
||||||
<foreground android:drawable="@mipmap/ic_sos_foreground"/>
|
|
||||||
</adaptive-icon>
|
|
||||||
@@ -1,5 +1,6 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
|
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
|
||||||
<background android:drawable="@color/light"/>
|
<background android:drawable="@android:color/white"/>
|
||||||
<foreground android:drawable="@mipmap/ic_start_foreground"/>
|
<foreground android:drawable="@drawable/ic_start_foreground"/>
|
||||||
|
<monochrome android:drawable="@drawable/ic_start_foreground"/>
|
||||||
</adaptive-icon>
|
</adaptive-icon>
|
||||||
@@ -1,5 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
|
||||||
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
|
|
||||||
<background android:drawable="@color/light"/>
|
|
||||||
<foreground android:drawable="@mipmap/ic_start_foreground"/>
|
|
||||||
</adaptive-icon>
|
|
||||||
@@ -1,5 +1,6 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
|
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
|
||||||
<background android:drawable="@color/light"/>
|
<background android:drawable="@android:color/white"/>
|
||||||
<foreground android:drawable="@mipmap/ic_stop_foreground"/>
|
<foreground android:drawable="@drawable/ic_stop_foreground"/>
|
||||||
|
<monochrome android:drawable="@drawable/ic_stop_foreground"/>
|
||||||
</adaptive-icon>
|
</adaptive-icon>
|
||||||
@@ -1,5 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
|
||||||
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
|
|
||||||
<background android:drawable="@color/light"/>
|
|
||||||
<foreground android:drawable="@mipmap/ic_stop_foreground"/>
|
|
||||||
</adaptive-icon>
|
|
||||||
|
До Ширина: | Высота: | Размер: 4.2 KiB После Ширина: | Высота: | Размер: 4.0 KiB |
|
До Ширина: | Высота: | Размер: 3.0 KiB |
|
До Ширина: | Высота: | Размер: 3.1 KiB После Ширина: | Высота: | Размер: 3.6 KiB |
|
До Ширина: | Высота: | Размер: 1.5 KiB |
|
До Ширина: | Высота: | Размер: 3.2 KiB После Ширина: | Высота: | Размер: 3.7 KiB |
|
До Ширина: | Высота: | Размер: 1.7 KiB |
|
До Ширина: | Высота: | Размер: 3.1 KiB После Ширина: | Высота: | Размер: 3.6 KiB |
|
До Ширина: | Высота: | Размер: 1.6 KiB |
|
До Ширина: | Высота: | Размер: 2.5 KiB После Ширина: | Высота: | Размер: 2.4 KiB |
|
До Ширина: | Высота: | Размер: 1.7 KiB |
|
До Ширина: | Высота: | Размер: 1.9 KiB После Ширина: | Высота: | Размер: 1.9 KiB |
|
До Ширина: | Высота: | Размер: 930 B |
|
До Ширина: | Высота: | Размер: 2.0 KiB После Ширина: | Высота: | Размер: 2.0 KiB |
|
До Ширина: | Высота: | Размер: 1.0 KiB |
|
До Ширина: | Высота: | Размер: 2.0 KiB После Ширина: | Высота: | Размер: 1.9 KiB |
|
До Ширина: | Высота: | Размер: 943 B |
|
До Ширина: | Высота: | Размер: 5.9 KiB После Ширина: | Высота: | Размер: 5.7 KiB |
|
До Ширина: | Высота: | Размер: 3.8 KiB |
|
До Ширина: | Высота: | Размер: 4.5 KiB После Ширина: | Высота: | Размер: 5.1 KiB |
|
До Ширина: | Высота: | Размер: 2.1 KiB |
|
До Ширина: | Высота: | Размер: 4.6 KiB После Ширина: | Высота: | Размер: 5.3 KiB |
|
До Ширина: | Высота: | Размер: 2.4 KiB |
|
До Ширина: | Высота: | Размер: 4.5 KiB После Ширина: | Высота: | Размер: 5.1 KiB |
|
До Ширина: | Высота: | Размер: 2.1 KiB |
|
До Ширина: | Высота: | Размер: 9.4 KiB После Ширина: | Высота: | Размер: 9.3 KiB |
|
До Ширина: | Высота: | Размер: 7.4 KiB |
|
До Ширина: | Высота: | Размер: 7.3 KiB После Ширина: | Высота: | Размер: 8.2 KiB |
|
До Ширина: | Высота: | Размер: 4.0 KiB |
|
До Ширина: | Высота: | Размер: 7.6 KiB После Ширина: | Высота: | Размер: 8.5 KiB |
|
До Ширина: | Высота: | Размер: 4.6 KiB |
|
До Ширина: | Высота: | Размер: 7.3 KiB После Ширина: | Высота: | Размер: 8.2 KiB |
|
До Ширина: | Высота: | Размер: 4.0 KiB |
|
До Ширина: | Высота: | Размер: 13 KiB После Ширина: | Высота: | Размер: 13 KiB |
|
До Ширина: | Высота: | Размер: 8.8 KiB |
|
До Ширина: | Высота: | Размер: 11 KiB После Ширина: | Высота: | Размер: 12 KiB |
|
До Ширина: | Высота: | Размер: 5.4 KiB |
|
До Ширина: | Высота: | Размер: 11 KiB После Ширина: | Высота: | Размер: 12 KiB |
|
До Ширина: | Высота: | Размер: 6.2 KiB |
|
До Ширина: | Высота: | Размер: 11 KiB После Ширина: | Высота: | Размер: 12 KiB |
|
До Ширина: | Высота: | Размер: 5.4 KiB |
@@ -0,0 +1,53 @@
|
|||||||
|
<?xml version='1.0' encoding='UTF-8'?>
|
||||||
|
<resources>
|
||||||
|
<string name="app_name">Traccar Client</string>
|
||||||
|
<string name="app_logo">Traccar</string>
|
||||||
|
<string name="shortcut_start">Inicia servei</string>
|
||||||
|
<string name="shortcut_stop">Atura servei</string>
|
||||||
|
<string name="shortcut_sos">Envia SOS</string>
|
||||||
|
<string name="channel_default">Canal principal</string>
|
||||||
|
<string name="settings_id_title">Id dispositiu</string>
|
||||||
|
<string name="settings_url_title">URL Servidor</string>
|
||||||
|
<string name="settings_url_summary">URL del servidor de seguiment</string>
|
||||||
|
<string name="settings_interval_title">Interval</string>
|
||||||
|
<string name="settings_interval_summary">Interval d\'enviament en segons</string>
|
||||||
|
<string name="settings_distance_title">Distància</string>
|
||||||
|
<string name="settings_distance_summary">Distància en metres per informar</string>
|
||||||
|
<string name="settings_angle_title">Angle</string>
|
||||||
|
<string name="settings_angle_summary">Graus de diferència per informar</string>
|
||||||
|
<string name="settings_status_title">Estat del servei</string>
|
||||||
|
<string name="settings_status_off">Aturat</string>
|
||||||
|
<string name="settings_status_on">Inciat</string>
|
||||||
|
<string name="settings_status_off_summary">Servei aturat</string>
|
||||||
|
<string name="settings_status_on_summary">Servei iniciat</string>
|
||||||
|
<string name="settings_buffer">Buffer</string>
|
||||||
|
<string name="settings_buffer_off_summary">Buffer desactivat</string>
|
||||||
|
<string name="settings_buffer_on_summary">Buffer activat</string>
|
||||||
|
<string name="settings_wakelock">Bloca despertar</string>
|
||||||
|
<string name="settings_wakelock_off_summary">Bloca despertar desactivat</string>
|
||||||
|
<string name="settings_wakelock_on_summary">Bloca despertar activat</string>
|
||||||
|
<string name="settings_accuracy_title">Precisió</string>
|
||||||
|
<string name="settings_accuracy_summary">Precisió</string>
|
||||||
|
<string name="settings_accuracy_high">Precisió alta</string>
|
||||||
|
<string name="settings_accuracy_medium">Precisió mitjana</string>
|
||||||
|
<string name="settings_accuracy_low">Precisió baixa</string>
|
||||||
|
<string name="settings_foreground_title">Primer pla</string>
|
||||||
|
<string name="settings_foreground_summary">En primer pla</string>
|
||||||
|
<string name="menu_status">Estat</string>
|
||||||
|
<string name="menu_info">Informació</string>
|
||||||
|
<string name="menu_shortcuts">Dreceres</string>
|
||||||
|
<string name="menu_clear">Netejar</string>
|
||||||
|
<string name="status_service_create">Servei iniciat</string>
|
||||||
|
<string name="status_service_destroy">Servei aturat</string>
|
||||||
|
<string name="status_send_success">Enviat correctament</string>
|
||||||
|
<string name="status_send_fail">Error a l\'enviar</string>
|
||||||
|
<string name="status_location_update">Actualització de localització</string>
|
||||||
|
<string name="status_network_online">Xarxa en línia</string>
|
||||||
|
<string name="status_network_offline">Xarxa fora de línia</string>
|
||||||
|
<string name="hidden_app_name">Configuració del dispositiu</string>
|
||||||
|
<string name="hidden_alert">Aplicació ocultada. Per obrir-la de nou escriviu 8722227 (TRACCAR).</string>
|
||||||
|
<string name="error_msg_invalid_url">Adreça URL incorrecte</string>
|
||||||
|
<string name="request_exception">Per obtenir contínuament les dades de localització, desactivi la optimització de la bateria per aquesta aplicació</string>
|
||||||
|
<string name="request_background">Per obtenir contínuament les dades de localització, activi el permís \"%s\".</string>
|
||||||
|
<string name="request_background_option">Permetre tot el temps</string>
|
||||||
|
</resources>
|
||||||
@@ -34,6 +34,7 @@
|
|||||||
<string name="settings_foreground_title">Popředí služba</string>
|
<string name="settings_foreground_title">Popředí služba</string>
|
||||||
<string name="settings_foreground_summary">Zvýšit prioritu služba</string>
|
<string name="settings_foreground_summary">Zvýšit prioritu služba</string>
|
||||||
<string name="menu_status">Stav</string>
|
<string name="menu_status">Stav</string>
|
||||||
|
<string name="menu_info">Informace</string>
|
||||||
<string name="menu_shortcuts">Přidat zástupce</string>
|
<string name="menu_shortcuts">Přidat zástupce</string>
|
||||||
<string name="menu_clear">Vyčistit</string>
|
<string name="menu_clear">Vyčistit</string>
|
||||||
<string name="status_service_create">Služba spuštěna</string>
|
<string name="status_service_create">Služba spuštěna</string>
|
||||||
@@ -46,4 +47,7 @@
|
|||||||
<string name="hidden_app_name">Nastavení zařízení</string>
|
<string name="hidden_app_name">Nastavení zařízení</string>
|
||||||
<string name="hidden_alert">Aplikace byla skryta. Pro znovuotevření vytočte 8722227 (TRACCAR)</string>
|
<string name="hidden_alert">Aplikace byla skryta. Pro znovuotevření vytočte 8722227 (TRACCAR)</string>
|
||||||
<string name="error_msg_invalid_url">Prosím vložte platnou http:// nebo https:// URL</string>
|
<string name="error_msg_invalid_url">Prosím vložte platnou http:// nebo https:// URL</string>
|
||||||
|
<string name="request_exception">Chcete-li průběžně shromažďovat údaje o poloze, vypněte optimalizaci baterie pro aplikaci.</string>
|
||||||
|
<string name="request_background">Chcete-li průběžně shromažďovat údaje o poloze, zapněte \"%s\" oprávnění.</string>
|
||||||
|
<string name="request_background_option">Povolit po celou dobu</string>
|
||||||
</resources>
|
</resources>
|
||||||
|
|||||||
@@ -34,6 +34,7 @@
|
|||||||
<string name="settings_foreground_title">Υπηρεσία προσκηνίου</string>
|
<string name="settings_foreground_title">Υπηρεσία προσκηνίου</string>
|
||||||
<string name="settings_foreground_summary">Αύξηση προτεραιότητας της υπηρεσίας</string>
|
<string name="settings_foreground_summary">Αύξηση προτεραιότητας της υπηρεσίας</string>
|
||||||
<string name="menu_status">Κατάσταση</string>
|
<string name="menu_status">Κατάσταση</string>
|
||||||
|
<string name="menu_info">Πληροφορίες</string>
|
||||||
<string name="menu_shortcuts">Προσθήκη συντόμευσης</string>
|
<string name="menu_shortcuts">Προσθήκη συντόμευσης</string>
|
||||||
<string name="menu_clear">Καθαρισμός</string>
|
<string name="menu_clear">Καθαρισμός</string>
|
||||||
<string name="status_service_create">Η υπηρεσία εκκινήθηκε</string>
|
<string name="status_service_create">Η υπηρεσία εκκινήθηκε</string>
|
||||||
@@ -46,4 +47,7 @@
|
|||||||
<string name="hidden_app_name">Ρυθμίσεις συσκευής</string>
|
<string name="hidden_app_name">Ρυθμίσεις συσκευής</string>
|
||||||
<string name="hidden_alert">Η εφαρμογή αποκρύφτηκε. Για να προβληθεί καλέστε 8722227 (TRACCAR)</string>
|
<string name="hidden_alert">Η εφαρμογή αποκρύφτηκε. Για να προβληθεί καλέστε 8722227 (TRACCAR)</string>
|
||||||
<string name="error_msg_invalid_url">Παρακαλώ εισάγετε μία έγκυρη http:// ή https:// διεύθυνση</string>
|
<string name="error_msg_invalid_url">Παρακαλώ εισάγετε μία έγκυρη http:// ή https:// διεύθυνση</string>
|
||||||
|
<string name="request_exception">Για να συλλέγετε συνεχώς δεδομένα τοποθεσίας απενεργοποιήστε την βελτιστοποίηση μπαταρίας για την εφαρμογή.</string>
|
||||||
|
<string name="request_background">Για να συλλέγετε συνεχώς δεδομένα τοποθεσίας ενεργοποιήστε την επιλογή \"%s\".</string>
|
||||||
|
<string name="request_background_option">Να επιτρέπεται όλη την ώρα</string>
|
||||||
</resources>
|
</resources>
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
<?xml version='1.0' encoding='UTF-8'?>
|
<?xml version='1.0' encoding='UTF-8'?>
|
||||||
<resources>
|
<resources>
|
||||||
<string name="app_name">Cliente Traccar</string>
|
<string name="app_name">Traccar Client</string>
|
||||||
<string name="app_logo">Traccar</string>
|
<string name="app_logo">Traccar</string>
|
||||||
<string name="shortcut_start">Iniciar servicio</string>
|
<string name="shortcut_start">Iniciar servicio</string>
|
||||||
<string name="shortcut_stop">Detener servicio</string>
|
<string name="shortcut_stop">Detener servicio</string>
|
||||||
@@ -34,16 +34,20 @@
|
|||||||
<string name="settings_foreground_title">Servicio en primer plano</string>
|
<string name="settings_foreground_title">Servicio en primer plano</string>
|
||||||
<string name="settings_foreground_summary">Aumentar prioridad del servicio</string>
|
<string name="settings_foreground_summary">Aumentar prioridad del servicio</string>
|
||||||
<string name="menu_status">Estado</string>
|
<string name="menu_status">Estado</string>
|
||||||
|
<string name="menu_info">Info</string>
|
||||||
<string name="menu_shortcuts">Añadir acceso directo</string>
|
<string name="menu_shortcuts">Añadir acceso directo</string>
|
||||||
<string name="menu_clear">Limpiar</string>
|
<string name="menu_clear">Limpiar</string>
|
||||||
<string name="status_service_create">Servicio iniciado</string>
|
<string name="status_service_create">Servicio iniciado</string>
|
||||||
<string name="status_service_destroy">Servicio detenido</string>
|
<string name="status_service_destroy">Servicio detenido</string>
|
||||||
<string name="status_send_success">Enviado correctamente</string>
|
<string name="status_send_success">Enviado correctamente</string>
|
||||||
<string name="status_send_fail">Falló el envío</string>
|
<string name="status_send_fail">Fallo en el envío</string>
|
||||||
<string name="status_location_update">Actualización de localización</string>
|
<string name="status_location_update">Actualización de localización</string>
|
||||||
<string name="status_network_online">Red en línea</string>
|
<string name="status_network_online">Red en línea</string>
|
||||||
<string name="status_network_offline">Red fuera de línea</string>
|
<string name="status_network_offline">Red fuera de línea</string>
|
||||||
<string name="hidden_app_name">Ajustes del dispositivo</string>
|
<string name="hidden_app_name">Ajustes del dispositivo</string>
|
||||||
<string name="hidden_alert">La aplicación se ha ocultado. Para abrirla de nuevo por favor marque 8722227 (TRACCAR).</string>
|
<string name="hidden_alert">La aplicación se ha ocultado. Para abrirla de nuevo por favor marque 8722227 (TRACCAR).</string>
|
||||||
<string name="error_msg_invalid_url">Por favor. Introduzca una URL válida http:// ó https:// </string>
|
<string name="error_msg_invalid_url">Por favor, introduzca una URL válida http:// ó https:// </string>
|
||||||
|
<string name="request_exception">Para recoger continuamente los datos de localización, desactiva la optimización de la batería de la aplicación.</string>
|
||||||
|
<string name="request_background">Para recoger continuamente los datos de localización, por favor, activa el permiso \"%s\".</string>
|
||||||
|
<string name="request_background_option">Permitir todo el tiempo</string>
|
||||||
</resources>
|
</resources>
|
||||||
|
|||||||
@@ -23,6 +23,9 @@
|
|||||||
<string name="settings_buffer">Offline-puskurointi</string>
|
<string name="settings_buffer">Offline-puskurointi</string>
|
||||||
<string name="settings_buffer_off_summary">Puskurointi pois päältä</string>
|
<string name="settings_buffer_off_summary">Puskurointi pois päältä</string>
|
||||||
<string name="settings_buffer_on_summary">Puskurointi päälle</string>
|
<string name="settings_buffer_on_summary">Puskurointi päälle</string>
|
||||||
|
<string name="settings_wakelock">Lepotilalukko</string>
|
||||||
|
<string name="settings_wakelock_off_summary">Lepotilalukko pois päältä</string>
|
||||||
|
<string name="settings_wakelock_on_summary">Lepotilalukko päällä</string>
|
||||||
<string name="settings_accuracy_title">Sijainnin tarkkuus</string>
|
<string name="settings_accuracy_title">Sijainnin tarkkuus</string>
|
||||||
<string name="settings_accuracy_summary">Haluttu sijainnin tarkkuus</string>
|
<string name="settings_accuracy_summary">Haluttu sijainnin tarkkuus</string>
|
||||||
<string name="settings_accuracy_high">Korkea</string>
|
<string name="settings_accuracy_high">Korkea</string>
|
||||||
@@ -31,6 +34,7 @@
|
|||||||
<string name="settings_foreground_title">Edustapalvelu</string>
|
<string name="settings_foreground_title">Edustapalvelu</string>
|
||||||
<string name="settings_foreground_summary">Lisää palvelun prioriteettia</string>
|
<string name="settings_foreground_summary">Lisää palvelun prioriteettia</string>
|
||||||
<string name="menu_status">Tila</string>
|
<string name="menu_status">Tila</string>
|
||||||
|
<string name="menu_info">Tiedot</string>
|
||||||
<string name="menu_shortcuts">Lisää pikakuvakkeet</string>
|
<string name="menu_shortcuts">Lisää pikakuvakkeet</string>
|
||||||
<string name="menu_clear">Tyhjennä</string>
|
<string name="menu_clear">Tyhjennä</string>
|
||||||
<string name="status_service_create">Palvelu käynnistynyt</string>
|
<string name="status_service_create">Palvelu käynnistynyt</string>
|
||||||
@@ -43,4 +47,7 @@
|
|||||||
<string name="hidden_app_name">Laitteen asetukset</string>
|
<string name="hidden_app_name">Laitteen asetukset</string>
|
||||||
<string name="hidden_alert">Sovellus on piilotettu. Näppäile 8722227 (TRACCAR) avataksesi sovelluksen uudelleen.</string>
|
<string name="hidden_alert">Sovellus on piilotettu. Näppäile 8722227 (TRACCAR) avataksesi sovelluksen uudelleen.</string>
|
||||||
<string name="error_msg_invalid_url">Syötä kelvollinen http:// tai https:// URL-osoite</string>
|
<string name="error_msg_invalid_url">Syötä kelvollinen http:// tai https:// URL-osoite</string>
|
||||||
|
<string name="request_exception">Kerätäksesi jatkuvasti sijaintitietoa, poista akun optimointi käytöstä tältä sovellukselta.</string>
|
||||||
|
<string name="request_background">Kerätäksesi jatkuvasti sijaintitietoa, salli \"%s\" käyttöoikeus.</string>
|
||||||
|
<string name="request_background_option">Salli kokoajan</string>
|
||||||
</resources>
|
</resources>
|
||||||
|
|||||||
@@ -20,6 +20,12 @@
|
|||||||
<string name="settings_status_on">Arrêter</string>
|
<string name="settings_status_on">Arrêter</string>
|
||||||
<string name="settings_status_off_summary">Arrêté</string>
|
<string name="settings_status_off_summary">Arrêté</string>
|
||||||
<string name="settings_status_on_summary">En marche</string>
|
<string name="settings_status_on_summary">En marche</string>
|
||||||
|
<string name="settings_buffer">Mise en tampon hors ligne</string>
|
||||||
|
<string name="settings_buffer_off_summary">Mise en tampon désactivée</string>
|
||||||
|
<string name="settings_buffer_on_summary">Mise en tampon activée</string>
|
||||||
|
<string name="settings_wakelock">Wake lock</string>
|
||||||
|
<string name="settings_wakelock_off_summary">Wake lock off</string>
|
||||||
|
<string name="settings_wakelock_on_summary">Wake lock on</string>
|
||||||
<string name="settings_accuracy_title">Precision de la localisation</string>
|
<string name="settings_accuracy_title">Precision de la localisation</string>
|
||||||
<string name="settings_accuracy_summary">Précision de localisation désirée</string>
|
<string name="settings_accuracy_summary">Précision de localisation désirée</string>
|
||||||
<string name="settings_accuracy_high">Haut</string>
|
<string name="settings_accuracy_high">Haut</string>
|
||||||
|
|||||||
@@ -20,6 +20,12 @@
|
|||||||
<string name="settings_status_on">Megállítás</string>
|
<string name="settings_status_on">Megállítás</string>
|
||||||
<string name="settings_status_off_summary">Szolgáltatás megállítva</string>
|
<string name="settings_status_off_summary">Szolgáltatás megállítva</string>
|
||||||
<string name="settings_status_on_summary">Szolgáltatás elindítva</string>
|
<string name="settings_status_on_summary">Szolgáltatás elindítva</string>
|
||||||
|
<string name="settings_buffer">Offline pufferelés</string>
|
||||||
|
<string name="settings_buffer_off_summary">Pufferelés ki</string>
|
||||||
|
<string name="settings_buffer_on_summary">Pufferelés be</string>
|
||||||
|
<string name="settings_wakelock">Ébresztési zár</string>
|
||||||
|
<string name="settings_wakelock_off_summary">Ébresztési zár ki</string>
|
||||||
|
<string name="settings_wakelock_on_summary">Ébresztési zár be</string>
|
||||||
<string name="settings_accuracy_title">Pozíció pontossága</string>
|
<string name="settings_accuracy_title">Pozíció pontossága</string>
|
||||||
<string name="settings_accuracy_summary">Kívánt pozíció pontosság</string>
|
<string name="settings_accuracy_summary">Kívánt pozíció pontosság</string>
|
||||||
<string name="settings_accuracy_high">Magas</string>
|
<string name="settings_accuracy_high">Magas</string>
|
||||||
@@ -28,6 +34,7 @@
|
|||||||
<string name="settings_foreground_title">Előtér szolgáltatás</string>
|
<string name="settings_foreground_title">Előtér szolgáltatás</string>
|
||||||
<string name="settings_foreground_summary">Szolgáltatás prioritásának emelése</string>
|
<string name="settings_foreground_summary">Szolgáltatás prioritásának emelése</string>
|
||||||
<string name="menu_status">Státusz</string>
|
<string name="menu_status">Státusz</string>
|
||||||
|
<string name="menu_info">Infó</string>
|
||||||
<string name="menu_shortcuts">Parancsikon hozzáadása</string>
|
<string name="menu_shortcuts">Parancsikon hozzáadása</string>
|
||||||
<string name="menu_clear">Töröl</string>
|
<string name="menu_clear">Töröl</string>
|
||||||
<string name="status_service_create">Szolgáltatás elindítva</string>
|
<string name="status_service_create">Szolgáltatás elindítva</string>
|
||||||
@@ -40,4 +47,10 @@
|
|||||||
<string name="hidden_app_name">Eszköz beállítások</string>
|
<string name="hidden_app_name">Eszköz beállítások</string>
|
||||||
<string name="hidden_alert">Ez az applikáció el lett rejtve. Megnyitásához kérjük hívja a 8722227 (TRACCAR) telefonszámot.</string>
|
<string name="hidden_alert">Ez az applikáció el lett rejtve. Megnyitásához kérjük hívja a 8722227 (TRACCAR) telefonszámot.</string>
|
||||||
<string name="error_msg_invalid_url">Adjon meg egy érvényes URL-t (http:// vagy https://)</string>
|
<string name="error_msg_invalid_url">Adjon meg egy érvényes URL-t (http:// vagy https://)</string>
|
||||||
|
<string name="request_exception">A folyamatos helyadatok
|
||||||
|
gyűjtéséhez kapcsolja ki
|
||||||
|
az alkalmazás akkumulátor
|
||||||
|
optimazilását.</string>
|
||||||
|
<string name="request_background">A folyamatos helyadat gyűjtéshez engedélyezze a \"%s\" jogosultságot.</string>
|
||||||
|
<string name="request_background_option">Mindig engedélyezve</string>
|
||||||
</resources>
|
</resources>
|
||||||
|
|||||||
@@ -20,6 +20,12 @@
|
|||||||
<string name="settings_status_on">Stop</string>
|
<string name="settings_status_on">Stop</string>
|
||||||
<string name="settings_status_off_summary">Servizio arrestato</string>
|
<string name="settings_status_off_summary">Servizio arrestato</string>
|
||||||
<string name="settings_status_on_summary">Servizio avviato</string>
|
<string name="settings_status_on_summary">Servizio avviato</string>
|
||||||
|
<string name="settings_buffer">Buffering offline</string>
|
||||||
|
<string name="settings_buffer_off_summary">Buffering spento</string>
|
||||||
|
<string name="settings_buffer_on_summary">Buffering acceso</string>
|
||||||
|
<string name="settings_wakelock">Wake lock</string>
|
||||||
|
<string name="settings_wakelock_off_summary">Wake lock spento</string>
|
||||||
|
<string name="settings_wakelock_on_summary">Wake lock acceso</string>
|
||||||
<string name="settings_accuracy_title">Accuratezza posizione</string>
|
<string name="settings_accuracy_title">Accuratezza posizione</string>
|
||||||
<string name="settings_accuracy_summary">Precisione desiderata per la posizione</string>
|
<string name="settings_accuracy_summary">Precisione desiderata per la posizione</string>
|
||||||
<string name="settings_accuracy_high">Alta</string>
|
<string name="settings_accuracy_high">Alta</string>
|
||||||
@@ -28,6 +34,7 @@
|
|||||||
<string name="settings_foreground_title">Servizio in primo piano</string>
|
<string name="settings_foreground_title">Servizio in primo piano</string>
|
||||||
<string name="settings_foreground_summary">Aumenta la priorità del servizio</string>
|
<string name="settings_foreground_summary">Aumenta la priorità del servizio</string>
|
||||||
<string name="menu_status">Stato</string>
|
<string name="menu_status">Stato</string>
|
||||||
|
<string name="menu_info">Informazioni</string>
|
||||||
<string name="menu_shortcuts">Aggiungi combinazione rapida</string>
|
<string name="menu_shortcuts">Aggiungi combinazione rapida</string>
|
||||||
<string name="menu_clear">Pulisci</string>
|
<string name="menu_clear">Pulisci</string>
|
||||||
<string name="status_service_create">Servizio avviato</string>
|
<string name="status_service_create">Servizio avviato</string>
|
||||||
@@ -40,4 +47,7 @@
|
|||||||
<string name="hidden_app_name">Impostazioni dispositivo</string>
|
<string name="hidden_app_name">Impostazioni dispositivo</string>
|
||||||
<string name="hidden_alert">La app è stata nascosta. Per aprirla nuovamente digita 8722227 (TRACCAR).</string>
|
<string name="hidden_alert">La app è stata nascosta. Per aprirla nuovamente digita 8722227 (TRACCAR).</string>
|
||||||
<string name="error_msg_invalid_url">Per favore inserisci un URL valido http:// o https://</string>
|
<string name="error_msg_invalid_url">Per favore inserisci un URL valido http:// o https://</string>
|
||||||
|
<string name="request_exception">Per abilitare la raccolta continua delle posizioni, disabilita le ottimizzazioni batteria per questa applicazione</string>
|
||||||
|
<string name="request_background">Per abilitare la raccolta delle posizione, abilita il permesso \"%s\"</string>
|
||||||
|
<string name="request_background_option">Contenti per tutto il tempo</string>
|
||||||
</resources>
|
</resources>
|
||||||
|
|||||||
@@ -0,0 +1,49 @@
|
|||||||
|
<?xml version='1.0' encoding='UTF-8'?>
|
||||||
|
<resources>
|
||||||
|
<string name="app_name">Traccar კლიენტი</string>
|
||||||
|
<string name="app_logo">Traccar</string>
|
||||||
|
<string name="shortcut_start">სერვისის სტარტი</string>
|
||||||
|
<string name="shortcut_stop">სერვისის დასტოპება</string>
|
||||||
|
<string name="shortcut_sos">SOS სიგნალის გაგზავნა</string>
|
||||||
|
<string name="channel_default">ძირითადი არხი</string>
|
||||||
|
<string name="settings_id_title">მოწყობილობის იდენტიფიკატორი</string>
|
||||||
|
<string name="settings_url_title">სერვერის მისამართი URL</string>
|
||||||
|
<string name="settings_url_summary">ტრეკინგ სერვერის მისამართი URL</string>
|
||||||
|
<string name="settings_interval_title">სიხშირე</string>
|
||||||
|
<string name="settings_interval_summary">რეპორტებს შორის ინტერვალი წამებში</string>
|
||||||
|
<string name="settings_distance_title">დისტანცია</string>
|
||||||
|
<string name="settings_distance_summary">რეპორტებს შორის ინტერვალი მეტრებში</string>
|
||||||
|
<string name="settings_angle_title">მიმართულება</string>
|
||||||
|
<string name="settings_angle_summary">მიმართულების რეპორტი გრადუსებში</string>
|
||||||
|
<string name="settings_status_title">სერვისი სტატუსი</string>
|
||||||
|
<string name="settings_status_off">სტარტი</string>
|
||||||
|
<string name="settings_status_on">შეჩერება</string>
|
||||||
|
<string name="settings_status_off_summary">სერვისი შეჩერებულია</string>
|
||||||
|
<string name="settings_status_on_summary">სერვისი გაშვებულია</string>
|
||||||
|
<string name="settings_buffer">ოფლაინ ბუფერიზაცია</string>
|
||||||
|
<string name="settings_buffer_off_summary">ბუფერიზაცია გამორთულია</string>
|
||||||
|
<string name="settings_buffer_on_summary">ბუფერიზაცია ჩართულია</string>
|
||||||
|
<string name="settings_wakelock">გაღვიძების ბლოკირება</string>
|
||||||
|
<string name="settings_wakelock_off_summary">გაღვიძების ბლოკირება გამორთულია</string>
|
||||||
|
<string name="settings_wakelock_on_summary">გაღვიძების ბლოკირება ჩართულია</string>
|
||||||
|
<string name="settings_accuracy_title">მდებარეობის სიზუსტე</string>
|
||||||
|
<string name="settings_accuracy_summary">მდებარეობის სასურველი სიზუსტე</string>
|
||||||
|
<string name="settings_accuracy_high">მაღალი</string>
|
||||||
|
<string name="settings_accuracy_medium">საშუალო</string>
|
||||||
|
<string name="settings_accuracy_low">დაბალი</string>
|
||||||
|
<string name="settings_foreground_title">ფონური სერვისი</string>
|
||||||
|
<string name="settings_foreground_summary">სერვისის პრიორიტეტის გაზრდა</string>
|
||||||
|
<string name="menu_status">სტატუსი</string>
|
||||||
|
<string name="menu_shortcuts">შორტკატის დამატება</string>
|
||||||
|
<string name="menu_clear">გასუფთავება</string>
|
||||||
|
<string name="status_service_create">სერვისი გაშვებულია</string>
|
||||||
|
<string name="status_service_destroy">სერვისი შეჩერებულია</string>
|
||||||
|
<string name="status_send_success">წარმატებით გაიგზავნა</string>
|
||||||
|
<string name="status_send_fail">გაგზავნა ვერ მოხერხდა</string>
|
||||||
|
<string name="status_location_update">მდებარეობა განახლდა</string>
|
||||||
|
<string name="status_network_online">ქსელი კავშირშია</string>
|
||||||
|
<string name="status_network_offline">ქსელი გამორთულია</string>
|
||||||
|
<string name="hidden_app_name">მოწყობილობის პარამეტრები</string>
|
||||||
|
<string name="hidden_alert">პროგრამა დამალულია. მის გასახსნელად გთხოვთ აკრიფოთ 8722227 (TRACCAR).</string>
|
||||||
|
<string name="error_msg_invalid_url">გთხოვთ, შეიყვანოთ სწორი http: // ან https: // URL</string>
|
||||||
|
</resources>
|
||||||
@@ -34,6 +34,7 @@
|
|||||||
<string name="settings_foreground_title">Zināšanu servis</string>
|
<string name="settings_foreground_title">Zināšanu servis</string>
|
||||||
<string name="settings_foreground_summary">Paaugstināt servisa prioritāti</string>
|
<string name="settings_foreground_summary">Paaugstināt servisa prioritāti</string>
|
||||||
<string name="menu_status">Statuss</string>
|
<string name="menu_status">Statuss</string>
|
||||||
|
<string name="menu_info">Informācija</string>
|
||||||
<string name="menu_shortcuts">Pievienot saīsnes</string>
|
<string name="menu_shortcuts">Pievienot saīsnes</string>
|
||||||
<string name="menu_clear">Notīrīt</string>
|
<string name="menu_clear">Notīrīt</string>
|
||||||
<string name="status_service_create">Serviss uzsākts</string>
|
<string name="status_service_create">Serviss uzsākts</string>
|
||||||
@@ -46,4 +47,5 @@
|
|||||||
<string name="hidden_app_name">Ierīces iestatījumi</string>
|
<string name="hidden_app_name">Ierīces iestatījumi</string>
|
||||||
<string name="hidden_alert">Lietotne ir paslēpta. Zvaniet 8722227 (TRACCAR), lai to atkal parādītu.</string>
|
<string name="hidden_alert">Lietotne ir paslēpta. Zvaniet 8722227 (TRACCAR), lai to atkal parādītu.</string>
|
||||||
<string name="error_msg_invalid_url">Lūdzu ievadiet derīgu http:// vai https:// URL</string>
|
<string name="error_msg_invalid_url">Lūdzu ievadiet derīgu http:// vai https:// URL</string>
|
||||||
|
<string name="request_background_option">Visu laiku atļauts</string>
|
||||||
</resources>
|
</resources>
|
||||||
|
|||||||
@@ -1,9 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
|
||||||
<resources>
|
|
||||||
|
|
||||||
<color name="primary">#2E7D32</color>
|
|
||||||
<color name="primary_dark">#1B5E20</color>
|
|
||||||
<color name="accent">#81C784</color>
|
|
||||||
<color name="light">#FAFAFA</color>
|
|
||||||
|
|
||||||
</resources>
|
|
||||||
@@ -34,6 +34,7 @@
|
|||||||
<string name="settings_foreground_title">Voorgrond service</string>
|
<string name="settings_foreground_title">Voorgrond service</string>
|
||||||
<string name="settings_foreground_summary">Verhoog voorrang voor service</string>
|
<string name="settings_foreground_summary">Verhoog voorrang voor service</string>
|
||||||
<string name="menu_status">Status</string>
|
<string name="menu_status">Status</string>
|
||||||
|
<string name="menu_info">Info</string>
|
||||||
<string name="menu_shortcuts">Voeg snelkoppelingen toe</string>
|
<string name="menu_shortcuts">Voeg snelkoppelingen toe</string>
|
||||||
<string name="menu_clear">Wis</string>
|
<string name="menu_clear">Wis</string>
|
||||||
<string name="status_service_create">Service gestart</string>
|
<string name="status_service_create">Service gestart</string>
|
||||||
@@ -46,4 +47,7 @@
|
|||||||
<string name="hidden_app_name">Toestel instellingen</string>
|
<string name="hidden_app_name">Toestel instellingen</string>
|
||||||
<string name="hidden_alert">De app is verborgen. Om hem opnieuw te openen bel je naar 8722227 (TRACCAR).</string>
|
<string name="hidden_alert">De app is verborgen. Om hem opnieuw te openen bel je naar 8722227 (TRACCAR).</string>
|
||||||
<string name="error_msg_invalid_url">Voer alstublieft een geldige http:// of https:// URL in</string>
|
<string name="error_msg_invalid_url">Voer alstublieft een geldige http:// of https:// URL in</string>
|
||||||
|
<string name="request_exception">Om continu locatiegegevens te kunnen verzamelen is het noodzakelijk dat accuoptimalisatie voor deze app is uitgeschakeld.</string>
|
||||||
|
<string name="request_background">Geef de \"1%s\" permissie om continu locatieinformatie bij te houden.</string>
|
||||||
|
<string name="request_background_option">Altijd toestaan</string>
|
||||||
</resources>
|
</resources>
|
||||||
|
|||||||
@@ -34,6 +34,7 @@
|
|||||||
<string name="settings_foreground_title">Usługa pierwszoplanowa</string>
|
<string name="settings_foreground_title">Usługa pierwszoplanowa</string>
|
||||||
<string name="settings_foreground_summary">Zwiększ priorytet usługi</string>
|
<string name="settings_foreground_summary">Zwiększ priorytet usługi</string>
|
||||||
<string name="menu_status">Status</string>
|
<string name="menu_status">Status</string>
|
||||||
|
<string name="menu_info">Info</string>
|
||||||
<string name="menu_shortcuts">Dodaj skróty</string>
|
<string name="menu_shortcuts">Dodaj skróty</string>
|
||||||
<string name="menu_clear">Wyczyść</string>
|
<string name="menu_clear">Wyczyść</string>
|
||||||
<string name="status_service_create">Usługa uruchomiona</string>
|
<string name="status_service_create">Usługa uruchomiona</string>
|
||||||
@@ -46,4 +47,7 @@
|
|||||||
<string name="hidden_app_name">Ustawienia urządzenia</string>
|
<string name="hidden_app_name">Ustawienia urządzenia</string>
|
||||||
<string name="hidden_alert">Aplikacja została ukryta. By ją otworzyć, zadzwoń pod 8722227 (TRACCAR).</string>
|
<string name="hidden_alert">Aplikacja została ukryta. By ją otworzyć, zadzwoń pod 8722227 (TRACCAR).</string>
|
||||||
<string name="error_msg_invalid_url">Wprowadź poprawny adres http:// lub https:// URL</string>
|
<string name="error_msg_invalid_url">Wprowadź poprawny adres http:// lub https:// URL</string>
|
||||||
|
<string name="request_exception">Do stałego zbierania danych o lokalizacji, należy wyłączyć optymalizację baterii w aplikacji.</string>
|
||||||
|
<string name="request_background">Włącz zezwolenie \"%s\", aby ciągle zbierać dane o lokalizacji.</string>
|
||||||
|
<string name="request_background_option">Pozwól cały czas</string>
|
||||||
</resources>
|
</resources>
|
||||||
|
|||||||
@@ -34,6 +34,7 @@
|
|||||||
<string name="settings_foreground_title">Serviço em primeiro plano</string>
|
<string name="settings_foreground_title">Serviço em primeiro plano</string>
|
||||||
<string name="settings_foreground_summary">Aumentar a prioridade do serviço</string>
|
<string name="settings_foreground_summary">Aumentar a prioridade do serviço</string>
|
||||||
<string name="menu_status">Estado</string>
|
<string name="menu_status">Estado</string>
|
||||||
|
<string name="menu_info">Informação</string>
|
||||||
<string name="menu_shortcuts">Adicionar atalhos</string>
|
<string name="menu_shortcuts">Adicionar atalhos</string>
|
||||||
<string name="menu_clear">Limpar</string>
|
<string name="menu_clear">Limpar</string>
|
||||||
<string name="status_service_create">Serviço iniciado</string>
|
<string name="status_service_create">Serviço iniciado</string>
|
||||||
@@ -46,4 +47,7 @@
|
|||||||
<string name="hidden_app_name">Configurações do Dispositivo</string>
|
<string name="hidden_app_name">Configurações do Dispositivo</string>
|
||||||
<string name="hidden_alert">O aplicativo foi escondido. Para abrir novamente por favor digite 8722227 (TRACCAR).</string>
|
<string name="hidden_alert">O aplicativo foi escondido. Para abrir novamente por favor digite 8722227 (TRACCAR).</string>
|
||||||
<string name="error_msg_invalid_url">Digite uma URL http: // ou https: // válida</string>
|
<string name="error_msg_invalid_url">Digite uma URL http: // ou https: // válida</string>
|
||||||
|
<string name="request_exception">Para coletar dados de localização continuamente por favor desabilite a economia de bateria para o aplicativo.</string>
|
||||||
|
<string name="request_background">Para coletar dados de localização continuamente por favor habilite a permissão \"%s\".</string>
|
||||||
|
<string name="request_background_option">Permitir sempre</string>
|
||||||
</resources>
|
</resources>
|
||||||
|
|||||||
@@ -20,6 +20,12 @@
|
|||||||
<string name="settings_status_on">Стоп</string>
|
<string name="settings_status_on">Стоп</string>
|
||||||
<string name="settings_status_off_summary">Сервис остановлен</string>
|
<string name="settings_status_off_summary">Сервис остановлен</string>
|
||||||
<string name="settings_status_on_summary">Сервис запущен</string>
|
<string name="settings_status_on_summary">Сервис запущен</string>
|
||||||
|
<string name="settings_buffer">Оффлайн буферизация</string>
|
||||||
|
<string name="settings_buffer_off_summary">Буферизация выключена</string>
|
||||||
|
<string name="settings_buffer_on_summary">Буферизация включена</string>
|
||||||
|
<string name="settings_wakelock">Блокировка пробуждения</string>
|
||||||
|
<string name="settings_wakelock_off_summary">Блокировка выключена</string>
|
||||||
|
<string name="settings_wakelock_on_summary">Блокировка включена</string>
|
||||||
<string name="settings_accuracy_title">Точность местоположения</string>
|
<string name="settings_accuracy_title">Точность местоположения</string>
|
||||||
<string name="settings_accuracy_summary">Точность местоположения</string>
|
<string name="settings_accuracy_summary">Точность местоположения</string>
|
||||||
<string name="settings_accuracy_high">Высокая</string>
|
<string name="settings_accuracy_high">Высокая</string>
|
||||||
|
|||||||
@@ -1,20 +1,28 @@
|
|||||||
<?xml version='1.0' encoding='UTF-8'?>
|
<?xml version='1.0' encoding='UTF-8'?>
|
||||||
<resources>
|
<resources>
|
||||||
<string name="app_name">Traccar Client</string>
|
<string name="app_name">ට්රැකකාර් අනුග්රාහකය</string>
|
||||||
<string name="app_logo">Traccar</string>
|
<string name="app_logo">ට්රැකකාර්</string>
|
||||||
<string name="settings_id_title">උපකරණ හඳුන්වනය</string>
|
<string name="shortcut_start">සේවාව නවතන්න</string>
|
||||||
|
<string name="shortcut_stop">සේවාව නවතන්න</string>
|
||||||
|
<string name="settings_id_title">උපාංගයේ හඳුන්වනය</string>
|
||||||
|
<string name="settings_url_title">සේවාදායකයේ ඒ.ස.නි.</string>
|
||||||
|
<string name="settings_url_summary">ලුහුබැඳීමේ සේවාදායකයේ ඒ.ස.නි.</string>
|
||||||
<string name="settings_interval_title">සංඛ්යාතය</string>
|
<string name="settings_interval_title">සංඛ්යාතය</string>
|
||||||
<string name="settings_status_title">සේවා තත්වය</string>
|
<string name="settings_status_title">සේවාවේ තත්වය</string>
|
||||||
<string name="settings_status_off">ඇරැඹීම</string>
|
<string name="settings_status_off">අරඹන්න</string>
|
||||||
<string name="settings_status_on">නැවතීම</string>
|
<string name="settings_status_on">නවත්වන්න</string>
|
||||||
<string name="settings_status_off_summary">සේවාව අක්රීයයි</string>
|
<string name="settings_status_off_summary">සේවාව නවතා ඇත</string>
|
||||||
<string name="settings_status_on_summary">සේවාව ක්රියාත්මකයි</string>
|
<string name="settings_status_on_summary">සේවාව ධාවනය වෙමින්</string>
|
||||||
<string name="settings_foreground_title">Foreground service</string>
|
<string name="settings_foreground_title">පෙරබිම් සේවාව</string>
|
||||||
<string name="settings_foreground_summary">Increase service priority</string>
|
<string name="settings_foreground_summary">සේවාවේ ප්රමුඛත්වය වැඩිකරන්න</string>
|
||||||
<string name="menu_status">තත්වය</string>
|
<string name="menu_status">තත්වය</string>
|
||||||
<string name="menu_shortcuts">කෙටි මං එකතු කරන්න</string>
|
<string name="menu_info">තොරතුරු</string>
|
||||||
|
<string name="menu_shortcuts">කෙටිමං එකතු කරන්න</string>
|
||||||
<string name="menu_clear">හිස් කරන්න</string>
|
<string name="menu_clear">හිස් කරන්න</string>
|
||||||
<string name="status_send_fail">යැවිය නොහැකිය</string>
|
<string name="status_service_create">සේවාව ඇරඹිණි</string>
|
||||||
<string name="status_location_update">Location update</string>
|
<string name="status_service_destroy">සේවාව නැවතිණි</string>
|
||||||
|
<string name="status_send_success">සාර්ථකව යැවිණි</string>
|
||||||
|
<string name="status_send_fail">යැවීමට අසමත් විය</string>
|
||||||
|
<string name="status_location_update">ස්ථානය යාවත්කාලය</string>
|
||||||
<string name="hidden_app_name">උපකරණ සැකසුම්</string>
|
<string name="hidden_app_name">උපකරණ සැකසුම්</string>
|
||||||
</resources>
|
</resources>
|
||||||
|
|||||||
@@ -34,6 +34,7 @@
|
|||||||
<string name="settings_foreground_title">Prvi plan servis</string>
|
<string name="settings_foreground_title">Prvi plan servis</string>
|
||||||
<string name="settings_foreground_summary">Povecanje usluga prioritet</string>
|
<string name="settings_foreground_summary">Povecanje usluga prioritet</string>
|
||||||
<string name="menu_status">Status</string>
|
<string name="menu_status">Status</string>
|
||||||
|
<string name="menu_info">Info</string>
|
||||||
<string name="menu_shortcuts">Dodaj prečice</string>
|
<string name="menu_shortcuts">Dodaj prečice</string>
|
||||||
<string name="menu_clear">Očisti</string>
|
<string name="menu_clear">Očisti</string>
|
||||||
<string name="status_service_create">Servis pokrenut</string>
|
<string name="status_service_create">Servis pokrenut</string>
|
||||||
@@ -46,4 +47,7 @@
|
|||||||
<string name="hidden_app_name">Podešavanja uređaja</string>
|
<string name="hidden_app_name">Podešavanja uređaja</string>
|
||||||
<string name="hidden_alert">Aplikacija je skrivena. Da je otvorite kucajte 8722227 (TRACCAR).</string>
|
<string name="hidden_alert">Aplikacija je skrivena. Da je otvorite kucajte 8722227 (TRACCAR).</string>
|
||||||
<string name="error_msg_invalid_url">Molimo unesite pravilnu http:// ili https:// adresu</string>
|
<string name="error_msg_invalid_url">Molimo unesite pravilnu http:// ili https:// adresu</string>
|
||||||
|
<string name="request_exception">Da biste kontinuirano prikupljali podatke o lokaciji, isključite optimizaciju baterije za aplikaciju.</string>
|
||||||
|
<string name="request_background">Da biste kontinuirano prikupljali podatke o lokaciji, omogućite %s dozvolu.</string>
|
||||||
|
<string name="request_background_option">Dozvoljeno svo vreme</string>
|
||||||
</resources>
|
</resources>
|
||||||
|
|||||||
@@ -0,0 +1,53 @@
|
|||||||
|
<?xml version='1.0' encoding='UTF-8'?>
|
||||||
|
<resources>
|
||||||
|
<string name="app_name">Traccarklient</string>
|
||||||
|
<string name="app_logo">Traccar</string>
|
||||||
|
<string name="shortcut_start">Starta tjänsten</string>
|
||||||
|
<string name="shortcut_stop">Stoppa tjänsten</string>
|
||||||
|
<string name="shortcut_sos">Skicka SOS</string>
|
||||||
|
<string name="channel_default">Primärkanal</string>
|
||||||
|
<string name="settings_id_title">Enhets-ID</string>
|
||||||
|
<string name="settings_url_title">URL till servern</string>
|
||||||
|
<string name="settings_url_summary">URL till trackservern</string>
|
||||||
|
<string name="settings_interval_title">Frekvens</string>
|
||||||
|
<string name="settings_interval_summary">Uppdateringsintervall i sekunder</string>
|
||||||
|
<string name="settings_distance_title">Avstånd</string>
|
||||||
|
<string name="settings_distance_summary">Uppdateringsavstånd i meter</string>
|
||||||
|
<string name="settings_angle_title">Vinkel</string>
|
||||||
|
<string name="settings_angle_summary">Uppdateringsvinkel i grader</string>
|
||||||
|
<string name="settings_status_title">Tjänstens status</string>
|
||||||
|
<string name="settings_status_off">Starta</string>
|
||||||
|
<string name="settings_status_on">Stoppa</string>
|
||||||
|
<string name="settings_status_off_summary">Tjänsten har stoppats</string>
|
||||||
|
<string name="settings_status_on_summary">Tjänsten är igång</string>
|
||||||
|
<string name="settings_buffer">Buffring offline</string>
|
||||||
|
<string name="settings_buffer_off_summary">Buffring av</string>
|
||||||
|
<string name="settings_buffer_on_summary">Buffring på</string>
|
||||||
|
<string name="settings_wakelock">Förhindra viloläge</string>
|
||||||
|
<string name="settings_wakelock_off_summary">Förhindra viloläge av</string>
|
||||||
|
<string name="settings_wakelock_on_summary">Förhindra viloläge på</string>
|
||||||
|
<string name="settings_accuracy_title">Positionsnoggranhet</string>
|
||||||
|
<string name="settings_accuracy_summary">Önskad positionsnoggrannhet</string>
|
||||||
|
<string name="settings_accuracy_high">Hög</string>
|
||||||
|
<string name="settings_accuracy_medium">Medel</string>
|
||||||
|
<string name="settings_accuracy_low">Låg</string>
|
||||||
|
<string name="settings_foreground_title">Tjänsten i förgrunden</string>
|
||||||
|
<string name="settings_foreground_summary">Öka tjänstens prioritet</string>
|
||||||
|
<string name="menu_status">Status</string>
|
||||||
|
<string name="menu_info">Info</string>
|
||||||
|
<string name="menu_shortcuts">Lägg till länkar</string>
|
||||||
|
<string name="menu_clear">Rensa</string>
|
||||||
|
<string name="status_service_create">Tjänsten har startats</string>
|
||||||
|
<string name="status_service_destroy">Tjänsten har stoppats</string>
|
||||||
|
<string name="status_send_success">Skickat OK</string>
|
||||||
|
<string name="status_send_fail">Sändning misslyckades</string>
|
||||||
|
<string name="status_location_update">Positionsuppdatering</string>
|
||||||
|
<string name="status_network_online">Nätverk online</string>
|
||||||
|
<string name="status_network_offline">Nätverk offline</string>
|
||||||
|
<string name="hidden_app_name">Inställningar</string>
|
||||||
|
<string name="hidden_alert">App:en är gömd. För att öppna den igen, vänligen ring 8722227 (TRACCAR).</string>
|
||||||
|
<string name="error_msg_invalid_url">Vänligen fyll i en giltig http://- eller https://-URL</string>
|
||||||
|
<string name="request_exception">För att kontinuerligt samla in platsdata, stäng av batterioptimeringen för appen.</string>
|
||||||
|
<string name="request_background">För att kontinuerligt samla in platsdata vänligen aktivera \"%s\" behörighet.</string>
|
||||||
|
<string name="request_background_option">Tillåt hela tiden</string>
|
||||||
|
</resources>
|
||||||
@@ -7,37 +7,47 @@
|
|||||||
<string name="shortcut_sos">ส่ง SOS</string>
|
<string name="shortcut_sos">ส่ง SOS</string>
|
||||||
<string name="channel_default">ช่องหลัก</string>
|
<string name="channel_default">ช่องหลัก</string>
|
||||||
<string name="settings_id_title">หมายเลขอุปกรณ์</string>
|
<string name="settings_id_title">หมายเลขอุปกรณ์</string>
|
||||||
<string name="settings_url_title">ท๊่อยู่ URL เซิร์ฟเวอร์</string>
|
<string name="settings_url_title">URL เซิร์ฟเวอร์</string>
|
||||||
<string name="settings_url_summary">ท๊่อยู่ URL เซิร์ฟเวอร์ติดตาม</string>
|
<string name="settings_url_summary">URL เซิร์ฟเวอร์ติดตาม</string>
|
||||||
<string name="settings_interval_title">ช่วงเวลาส่งข้อมูล</string>
|
<string name="settings_interval_title">ความถี่</string>
|
||||||
<string name="settings_interval_summary">รายงานทุกช่วงเวลาวินาที</string>
|
<string name="settings_interval_summary">รายงานทุกช่วงเวลาวินาที</string>
|
||||||
<string name="settings_distance_title">ระยะทาง</string>
|
<string name="settings_distance_title">ระยะทาง</string>
|
||||||
<string name="settings_distance_summary">การรายงานระยะทางเมตร</string>
|
<string name="settings_distance_summary">การรายงานระยะทางแบบเมตร</string>
|
||||||
<string name="settings_angle_title">มุม</string>
|
<string name="settings_angle_title">มุม</string>
|
||||||
<string name="settings_angle_summary">รายงานในมุมองศา</string>
|
<string name="settings_angle_summary">รายงานในมุมองศา</string>
|
||||||
<string name="settings_status_title">สถานะเซิร์ฟเวอร์</string>
|
<string name="settings_status_title">สถานะเซอร์วิส</string>
|
||||||
<string name="settings_status_off">เริ่มต้น</string>
|
<string name="settings_status_off">เริ่มต้น</string>
|
||||||
<string name="settings_status_on">สิ้นสุด</string>
|
<string name="settings_status_on">สิ้นสุด</string>
|
||||||
<string name="settings_status_off_summary">เริ่มทำงาน</string>
|
<string name="settings_status_off_summary">เซอร์วิสหยุดทำงานแล้ว</string>
|
||||||
<string name="settings_status_on_summary">หยุดทำงาน</string>
|
<string name="settings_status_on_summary">เซอร์วิสทำงานอยู่</string>
|
||||||
<string name="settings_accuracy_title">ตำแหน่ง-ความแม่นยำ</string>
|
<string name="settings_buffer">บัฟเฟอร์แบบออฟไลน์</string>
|
||||||
<string name="settings_accuracy_summary">ตำแหน่ง-ต้องการความแม่นยำ</string>
|
<string name="settings_buffer_off_summary">ปิดบัฟเฟอร์</string>
|
||||||
<string name="settings_accuracy_high">สูงมาก</string>
|
<string name="settings_buffer_on_summary">เปิดบัฟเฟอร์</string>
|
||||||
|
<string name="settings_wakelock">ล็อกการปลุก</string>
|
||||||
|
<string name="settings_wakelock_off_summary">ปิดล็อกการปลุก</string>
|
||||||
|
<string name="settings_wakelock_on_summary">เปิดล็อกการปลุก</string>
|
||||||
|
<string name="settings_accuracy_title">ความแม่นยำของตำแหน่ง</string>
|
||||||
|
<string name="settings_accuracy_summary">ต้องการความแม่นยำของตำแหน่ง-</string>
|
||||||
|
<string name="settings_accuracy_high">สูง</string>
|
||||||
<string name="settings_accuracy_medium">ปานกลาง</string>
|
<string name="settings_accuracy_medium">ปานกลาง</string>
|
||||||
<string name="settings_accuracy_low">ต่ำ</string>
|
<string name="settings_accuracy_low">ต่ำ</string>
|
||||||
<string name="settings_foreground_title">ทำงานเบื้องหน้า</string>
|
<string name="settings_foreground_title">ทำงานเบื้องหน้า</string>
|
||||||
<string name="settings_foreground_summary">เพิ่มความลำดับสำคัญการทำงาน</string>
|
<string name="settings_foreground_summary">เพิ่มความลำดับสำคัญการทำงาน</string>
|
||||||
<string name="menu_status">สถานะ</string>
|
<string name="menu_status">สถานะ</string>
|
||||||
|
<string name="menu_info">ข้อมูล</string>
|
||||||
<string name="menu_shortcuts">เพิ่มชอร์ตคัท</string>
|
<string name="menu_shortcuts">เพิ่มชอร์ตคัท</string>
|
||||||
<string name="menu_clear">ล้างข้อมูล</string>
|
<string name="menu_clear">ล้างข้อมูล</string>
|
||||||
<string name="status_service_create">บริการเริ่มต้นแล้ว</string>
|
<string name="status_service_create">เซอร์วิสเริ่มทำงานแล้ว</string>
|
||||||
<string name="status_service_destroy">หยุดให้บริการแล้ว</string>
|
<string name="status_service_destroy">เซอร์วิสหยุดทำงานแล้ว</string>
|
||||||
<string name="status_send_success">ส่งข้อมูลเรียบร้อย</string>
|
<string name="status_send_success">ส่งข้อมูลเรียบร้อย</string>
|
||||||
<string name="status_send_fail">ส่งข้อมูลล้มเหลว</string>
|
<string name="status_send_fail">ส่งข้อมูลล้มเหลว</string>
|
||||||
<string name="status_location_update">ปรับปรุงตำแหน่ง</string>
|
<string name="status_location_update">ปรับปรุงตำแหน่ง</string>
|
||||||
<string name="status_network_online">เน็ต-ออนไลน์</string>
|
<string name="status_network_online">เครือข่ายออนไลน์</string>
|
||||||
<string name="status_network_offline">เน็ต-ออฟไลน์</string>
|
<string name="status_network_offline">เครือข่ายออฟไลน์</string>
|
||||||
<string name="hidden_app_name">ตั้งค่าอุปกรณ์</string>
|
<string name="hidden_app_name">ตั้งค่าอุปกรณ์</string>
|
||||||
<string name="hidden_alert">The app has been hidden. To open it again please dial 8722227 (TRACCAR).</string>
|
<string name="hidden_alert">แอพถูกซ่อน หากต้องการเปิดอีกครั้ง โปรดโทร 8722227 (TRACCAR)</string>
|
||||||
<string name="error_msg_invalid_url">โปรดใส่ค่า http:// or https:// URL ที่ถูกต้อง</string>
|
<string name="error_msg_invalid_url">โปรดใส่ค่า http:// หรือ https:// URL ที่ถูกต้อง</string>
|
||||||
|
<string name="request_exception">หากต้องการรวบรวมข้อมูลตำแหน่งอย่างต่อเนื่อง โปรดปิดการเพิ่มประสิทธิภาพแบตเตอรี่สำหรับแอป</string>
|
||||||
|
<string name="request_background">หากต้องการรวบรวมข้อมูลตำแหน่งอย่างต่อเนื่อง โปรดเปิดใช้การอนุญาต \"%s\"</string>
|
||||||
|
<string name="request_background_option">อนุญาตตลอดเวลา</string>
|
||||||
</resources>
|
</resources>
|
||||||
|
|||||||