Как получить местоположение android studio
Перейти к содержимому

Как получить местоположение android studio

  • автор:

Геолокация

Основные примеры использования геолокации — определить собственное местонахождение или местонахождение кота (geolocation), определить координаты какого-нибудь объекта, а также связать эти координаты с другими задачами — показать соседние кафе и рестораны, город, страну и т.д.

В своей документации Google теперь рекомендует использовать библиотеку Google Play Services для работы с местоположением. Примеры в статье используют старый API и были актуальны приблизительно в 2011-2015 годах. Сейчас примеры во многом устарели. Возможно, многое потом вообще станет не пригодным к использованию.

Прежде чем приступить к разработке приложений, связанных с геолокационными сервисами, разработчик должен запомнить несколько важных правил. Самая главное правило — местонахождение пользователя является конфиденциальной информацией. Вы всегда должны явно указать пользователю, что собираетесь использовать эти данные и запросить согласие на подобное использование. Очень многие известные компании пренебрегли этим правилом и были оштрафованы на крупные суммы, а также подмочили свою репутацию.

Сами геолокационные сервисы очень ресурсоёмки как по части потребления энергии, так и по части передачи объемов информации. Поэтому нужно осторожно подходить к использованию этих функций и всегда предусматривать возможность отключения ненужных сервисов.

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

Вы вошли на сайт, как гость.
Необходимо зарегистрироваться, чтобы прочитать статью

Получение местоположения пользователя

При запуске приложения требуется получить местоположение пользователя на карте. Погуглив и посмотрев в книге, единственное, что я нашел — это использовать слушатель смены расстояния:

LocationManager locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE); locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, new LocationListener() < @Override public void onLocationChanged(Location location) < //Получаю местоположение и отписываюсь locationManager.removeUpdates(this); . >. > 

Такой способ не всегда работает. Иногда приложение ждет 10 секунд-2 минуты, прежде чем слушатель сработает. Иногда просто не срабатывает (если телефон не двигается). Есть какая-то 100% работающая альтернатива запросить текущее расстояние (при условия нормальной работы GPS), а не ждать ответа в слушатель изменения?

�� Как получить и отобразить текущее местоположение пользователя на карте Google map на Android

Мануал

Автор cryptoparty На чтение 10 мин Опубликовано 01.11.2019

Многие приложения используют местоположение для предоставления услуг своим пользователям.

Примеры включают в себя множество приложений такси, таких как Uber.

Если вы хотите создать приложение, которое использует местоположение клиента, то вам повезло.

Я собираюсь показать вам, как узнать текущее местоположение пользователя и отобразить его на карте.

Найдите исходный код AndroidCurrentUserLocation на GitHub -> https://github.com/CodeGenes/AndroidCurrentUserLocation/tree/master

Сначала получите ключ API карт Google, следуя инструкциям на их странице.

Получив ключ и включив биллинг, вы должны активировать API карт с любыми дополнительными API, которые вам могут понадобиться, такими как Places API.

Создайте свой проект в Android Studio.

Перейдите к gradle.properties и добавьте эту строку в конце, убедитесь, что вы добавили свой ключ API.

# Project-wide Gradle settings. # IDE (e.g. Android Studio) users: # Gradle settings configured through the IDE *will override* # any settings specified in this file. # For more details on how to configure your build environment visit # http://www.gradle.org/docs/current/userguide/build_environment.html # Specifies the JVM arguments used for the daemon process. # The setting is particularly useful for tweaking memory settings. org.gradle.jvmargs=-Xmx1536m # When configured, Gradle will run in incubating parallel mode. # This option should only be used with decoupled projects. More details, visit # http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects # org.gradle.parallel=true # AndroidX package structure to make it clearer which packages are bundled with the # Android operating system, and which are packaged with your app's APK # https://developer.android.com/topic/libraries/support-library/androidx-rn android.useAndroidX=true # Automatically convert third-party libraries to use AndroidX android.enableJetifier=true # Kotlin code style for this project: "official" or "obsolete": kotlin.code.style=official ApiKeyMap="Insert Google Maps Key Here"

Откройте файл build.gradle (Module: app) и эти зависимости ..

apply plugin: 'com.android.application' apply plugin: 'kotlin-android' apply plugin: 'kotlin-android-extensions' android < compileSdkVersion 29 buildToolsVersion "29.0.2" defaultConfig < applicationId "com.computingforgeeks.trucksend" minSdkVersion 16 targetSdkVersion 29 versionCode 1 versionName "1.0" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" >buildTypes < debug < buildConfigField 'String', "ApiKeyMap", ApiKeyMap resValue 'string', "api_key_map", ApiKeyMap >release < minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' buildConfigField 'String', "ApiKeyMap", ApiKeyMap resValue 'string', "api_key_map", ApiKeyMap >> > dependencies

Нажмите «Sync Now» в правом верхнем углу, чтобы синхронизировать зависимости.

Откройте манифест и добавьте следующее:

 http://schemas.android.com/apk/res/android" xmlns:tools vglnk" href="http://schemas.android.com/tools" rel="nofollow">http://schemas.android.com/tools" package="com.computingforgeeks.trucksend">           

Откройте активити начните добавлять необходимые функции:

private lateinit var googleMap: GoogleMap private lateinit var fusedLocationProviderClient: FusedLocationProviderClient override fun onCreate(savedInstanceState: Bundle?)

Мы инициируем карты Google и используем FusedLocationProviderClient для получения текущего местоположения пользователя или последнего известного местоположения.

Обратите внимание, что моя деятельность теперь будет расширять onMapReady ().
Это необходимо для того, чтобы активити знало, когда карты Google готовы к отображению.

override fun onMapReady(map: GoogleMap?)

Мы должны запросить у пользователя разрешение на доступ к его местоположению.
Для этого мы будем использовать библиотеку разрешений Dexter.
Сначала мы проверяем, дал ли пользователь разрешение на размещение.

private fun isPermissionGiven(): Boolean

Если разрешение не предоставлено, мы вызываем метод givePermission, чтобы запросить разрешение.

private fun givePermission()

После предоставления разрешений вызовите функцию getCurrentLocation, которая использует FusedLocationProviderClient для получения текущего местоположения пользователя или последнего известного местоположения.

Мы используем locationRequest для обновления текущего местоположения пользователя через некоторый интервал для высокой точности, чтобы мы всегда были в курсе.

private fun getCurrentLocation() < val locationRequest = LocationRequest() locationRequest.priority = LocationRequest.PRIORITY_HIGH_ACCURACY locationRequest.interval = (10 * 1000).toLong() locationRequest.fastestInterval = 2000 val builder = LocationSettingsRequest.Builder() builder.addLocationRequest(locationRequest) val locationSettingsRequest = builder.build() val result = LocationServices.getSettingsClient(this).checkLocationSettings(locationSettingsRequest) result.addOnCompleteListener < task ->try < val response = task.getResult(ApiException::class.java) if (response. locationSettingsStates.isLocationPresent)< getLastLocation() >> catch (exception: ApiException) < when (exception.statusCode) < LocationSettingsStatusCodes.RESOLUTION_REQUIRED ->try < val resolvable = exception as ResolvableApiException resolvable.startResolutionForResult(this, REQUEST_CHECK_SETTINGS) >catch (e: IntentSender.SendIntentException) < >catch (e: ClassCastException) < >LocationSettingsStatusCodes.SETTINGS_CHANGE_UNAVAILABLE -> < >> > > >

Бонус Geocoder

В качестве бонуса я добавил метод Gecoder, чтобы попытаться получить адрес для данного местоположения!

private fun getLastLocation() < fusedLocationProviderClient.lastLocation .addOnCompleteListener(this) < task ->if (task.isSuccessful && task.result != null) < val mLastLocation = task.result var address = "No known address" val gcd = Geocoder(this, Locale.getDefault()) val addresses: Listtry < addresses = gcd.getFromLocation(mLastLocation. latitude, mLastLocation.longitude, 1) if (addresses.isNotEmpty()) < address = addresses[0].getAddressLine(0) >> catch (e: IOException) < e.printStackTrace() >val icon = BitmapDescriptorFactory.fromBitmap(BitmapFactory.decodeResource(this.resources, R.drawable.ic_pickup)) googleMap.addMarker( MarkerOptions() .position(LatLng(mLastLocation. latitude, mLastLocation.longitude)) .title("Current Location") .snippet(address) .icon(icon) ) val cameraPosition = CameraPosition.Builder() .target(LatLng(mLastLocation.latitude, mLastLocation.longitude)) .zoom(17f) .build() googleMap.moveCamera(CameraUpdateFactory.newCameraPosition(cameraPosition)) > else < Toast.makeText(this, "No current location found", Toast.LENGTH_LONG).show() >> > override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) < when (requestCode) < REQUEST_CHECK_SETTINGS -> < if (resultCode == Activity.RESULT_OK) < getCurrentLocation() >> > super.onActivityResult(requestCode, resultCode, data) >

Финальное активити выглядит так:

package com.computingforgeeks.trucksend import android.Manifest import android.app.Activity import android.content.Intent import android.content.IntentSender import android.content.pm.PackageManager import android.graphics.BitmapFactory import android.location.Address import android.location.Geocoder import android.os.Bundle import androidx.appcompat.app.AppCompatActivity import android.view.Menu import android.view.MenuItem import android.widget.Toast import androidx.core.app.ActivityCompat import com.google.android.gms.common.api.ApiException import com.google.android.gms.common.api.ResolvableApiException import com.google.android.gms.location.* import com.google.android.gms.maps.CameraUpdateFactory import com.google.android.gms.maps.GoogleMap import com.google.android.gms.maps.OnMapReadyCallback import com.google.android.gms.maps.SupportMapFragment import com.google.android.gms.maps.model.BitmapDescriptorFactory import com.google.android.gms.maps.model.CameraPosition import com.google.android.gms.maps.model.LatLng import com.google.android.gms.maps.model.MarkerOptions import com.karumi.dexter.Dexter import com.karumi.dexter.PermissionToken import com.karumi.dexter.listener.PermissionDeniedResponse import com.karumi.dexter.listener.PermissionGrantedResponse import com.karumi.dexter.listener.PermissionRequest import com.karumi.dexter.listener.single.PermissionListener import kotlinx.android.synthetic.main.activity_main.* import java.io.IOException import java.util.* class MainActivity : AppCompatActivity(), OnMapReadyCallback, PermissionListener < companion object < const val REQUEST_CHECK_SETTINGS = 43 >private lateinit var googleMap: GoogleMap private lateinit var fusedLocationProviderClient: FusedLocationProviderClient override fun onCreate(savedInstanceState: Bundle?) < super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) setSupportActionBar(toolbar) val mapFragment = supportFragmentManager.findFragmentById(R.id.map) as SupportMapFragment? mapFragment. getMapAsync(this) fusedLocationProviderClient = FusedLocationProviderClient(this) >override fun onMapReady(map: GoogleMap?) < googleMap = map?: return if (isPermissionGiven())< googleMap.isMyLocationEnabled = true googleMap.uiSettings.isMyLocationButtonEnabled = true googleMap.uiSettings.isZoomControlsEnabled = true getCurrentLocation() >else < givePermission() >> private fun isPermissionGiven(): Boolean < return ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED >private fun givePermission() < Dexter.withActivity(this) .withPermission(Manifest.permission.ACCESS_FINE_LOCATION) .withListener(this) .check() >override fun onPermissionGranted(response: PermissionGrantedResponse?) < getCurrentLocation() >override fun onPermissionRationaleShouldBeShown( permission: PermissionRequest?, token: PermissionToken? ) < token. continuePermissionRequest() >override fun onPermissionDenied(response: PermissionDeniedResponse?) < Toast.makeText(this, "Permission required for showing location", Toast.LENGTH_LONG).show() finish() >private fun getCurrentLocation() < val locationRequest = LocationRequest() locationRequest.priority = LocationRequest.PRIORITY_HIGH_ACCURACY locationRequest.interval = (10 * 1000).toLong() locationRequest.fastestInterval = 2000 val builder = LocationSettingsRequest.Builder() builder.addLocationRequest(locationRequest) val locationSettingsRequest = builder.build() val result = LocationServices.getSettingsClient(this).checkLocationSettings(locationSettingsRequest) result.addOnCompleteListener < task ->try < val response = task.getResult(ApiException::class.java) if (response. locationSettingsStates.isLocationPresent)< getLastLocation() >> catch (exception: ApiException) < when (exception.statusCode) < LocationSettingsStatusCodes.RESOLUTION_REQUIRED ->try < val resolvable = exception as ResolvableApiException resolvable.startResolutionForResult(this, REQUEST_CHECK_SETTINGS) >catch (e: IntentSender.SendIntentException) < >catch (e: ClassCastException) < >LocationSettingsStatusCodes.SETTINGS_CHANGE_UNAVAILABLE -> < >> > > > private fun getLastLocation() < fusedLocationProviderClient.lastLocation .addOnCompleteListener(this) < task ->if (task.isSuccessful && task.result != null) < val mLastLocation = task.result var address = "No known address" val gcd = Geocoder(this, Locale.getDefault()) val addresses: Listtry < addresses = gcd.getFromLocation(mLastLocation. latitude, mLastLocation.longitude, 1) if (addresses.isNotEmpty()) < address = addresses[0].getAddressLine(0) >> catch (e: IOException) < e.printStackTrace() >val icon = BitmapDescriptorFactory.fromBitmap(BitmapFactory.decodeResource(this.resources, R.drawable.ic_pickup)) googleMap.addMarker( MarkerOptions() .position(LatLng(mLastLocation. latitude, mLastLocation.longitude)) .title("Current Location") .snippet(address) .icon(icon) ) val cameraPosition = CameraPosition.Builder() .target(LatLng(mLastLocation.latitude, mLastLocation.longitude)) .zoom(17f) .build() googleMap.moveCamera(CameraUpdateFactory.newCameraPosition(cameraPosition)) > else < Toast.makeText(this, "No current location found", Toast.LENGTH_LONG).show() >> > override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) < when (requestCode) < REQUEST_CHECK_SETTINGS -> < if (resultCode == Activity.RESULT_OK) < getCurrentLocation() >> > super.onActivityResult(requestCode, resultCode, data) > override fun onCreateOptionsMenu(menu: Menu): Boolean < menuInflater.inflate(R.menu.menu_main, menu) return true >override fun onOptionsItemSelected(item: MenuItem): Boolean < return when (item.itemId) < R.id.action_settings ->true else -> super.onOptionsItemSelected(item) > > >

Теперь запустите ваше приложение, чтобы увидеть ваше текущее местоположение.

Как реализовать отслеживание местоположения андроид устройства на своем сайте

Занимаюсь грузоперевозками на своей газели, и у меня родилась идея сделать функцию отслеживания своего местоположения для всех посетителей своего сайта. Это очень удобно для тех, кто следит за своим грузом или тех, кто ждет машину. У меня получилось. И в этом посте я расскажу вам как реализовать эту функцию, которая, кстати, обойдется совсем недорого. Статья предназначена для людей, которые почти не имеют опыта в сфере создания сайтов и программировании в целом.

  • Редактор Visual Studio Code
  • Среда разработки Android Studio
  • Аккаунт Гугл для API Google Maps
  • Доменное имя и хостинг с базой данных SQL
  • Обычный телефон на андроиде

Для начала рассмотрим схему взаимодействия всех элементов.

После того как пользователь заходит на сайт, активируется подключенный в index.html файл myJsCode.js, в котором каждые 2 секунды идет обращение в google maps. В google maps передаются координаты текущего местоположения, которые хранятся в базе данных sql. Google maps возвращает карту с маркером, установленным в точке, соответствующей переданным координатам. Считывание новых координат из базы данных осуществляется в myJsCode.js через coordinatesToBrowser.php также каждые 2 секунды. Запись координат в базу данных осуществляет Android приложение через coordinatesFromAndroid.php каждые 2 секунды при условии движения андроид устройства. Пользователь приложения может включать и выключать определение координат. Далее соберем эту схему.

1. Для инициализации google maps потребуются API ключ. Для его получения переходим на https://cloud.google.com/maps-platform

Нажимаем Get started.

Создаем новый проект.

В созданном проекте выбираем Maps JavaScript API.

Жмем на гамбургер -> APIs & Services -> Credentials.

Нажимаем на +Create Credentials

И мы получили Api key

2. Создаем файл index.html и style.css и myJsCode.js. Писать код будем в редакторе Visual Studio Code, скачиваем его по ссылке https://code.visualstudio.com/

index.html В 71 строчке меняете API key на свой. В 69 строчке подключается файл myJsCode.js, который мы напишем ниже. В 53 строчке в блоке div будет располагаться карта с маркером.

Название сайта

Заголовок 1

8-111-11-11Ваше имя

Описание вашей деятельности

Заголовок 2:

Описание
  • Пункт1
  • Пункт2
  • Пункт3
  • Пункт4
Заголовок 3:Описание

Контакты: г. Ваш город
Email: yourMail@yandex.ru
телефон: 8-111-11-11-11

Далее пишем style.css В этом файле оставляем все как есть. Здесь уже предусмотрена адаптация под мобильные устройства с помощью media запросов.

* < margin: 0; padding: 0; >.box < max-width:1560px; margin: 0px auto; padding: 0px 0px; >header < position: fixed; background-color: white; padding-top: 10px; height:60px; width: 100%; box-shadow: 7px 7px 5px rgba(63, 62, 62, 0.6); /* Тень */ >.content < padding-top: 100px; >.logo < float:left; margin-left: 10px; >.logoTitle < float:left; margin-top: 10px; margin-left: 10px; text-decoration: none; font-family: sans-serif; font-size: 20px; color: #000; >.phoneAndName < text-align: center; color: #000; margin-bottom: 15px; >.imgphone < text-decoration: none; >.telephone < text-decoration: none; font-family: sans-serif; font-size: 30px; color: #000; >.yourName < color: #030c01; font-size: 30px; >.descriptionYourBuisless < text-align: center; font-size: 20px; color: #000; margin-bottom: 20px; padding: 0px 10px; >.descriptionHeader2 < justify-content: center; display:flex; >.Header2 < color: #000; font-size: 20px; padding-right: 10px; padding-left: 40px; >.Header2Text < padding-right: 20px; color: #000; font-size: 20px; margin-bottom: 20px; >.photoCargo < margin: auto; width:55%; height:100%; color: #000; >.row1 < padding-left: 20px; padding-right: 20px; padding-bottom: 20px; margin-right: 20px; >.row2 < padding-left: 20px; padding-right: 20px; padding-bottom: 20px; >li < font-size: 20px; color: #000; >#map-canvas < height:600px; width: 100%; margin-top: 20px; >.descriptionHeader3 < margin-top: 20px; justify-content: center; display:flex; >.Header3 < color: #000; font-size: 20px; padding-right: 10px; padding-left: 40px; >.Header3Text < padding-right: 20px; color: #000; font-size: 20px; margin-bottom: 20px; >footer < text-align: center; font-size: 14px; color: #000; margin-top: 20px; margin-bottom: 20px; padding-left: 5px; padding-right: 5px; >@media(min-width: 1560px) < .adPointers< justify-content: center; display:flex; >> @media(max-width: 1560px) < .adPointers< justify-content: center; display:flex; >.box < max-width:1460px; >> @media(max-width: 1400px) < .box< max-width:1360px; >.photoCargo < width:60%; >> @media(max-width: 1200px) < .box< max-width:970px; >.photoCargo < width:65%; >> @media(max-width: 992px) < .box< max-width:850px; >.photoCargo < width:80%; >> @media(max-width: 767px) < .box< max-width:none; >.photoCargo < width:90%; >> @media(max-width: 695px) < .photoCargo< width:95%; >> @media(max-width: 450px) < .adPointers< flex-direction: column; margin-left: 100px; >>

myJsCode.js В 1 и 2 строчке задаются координаты по умолчанию. В 6 строчке функция инициализации google maps. Внутри функции setTimeout каждые 2 секунды идет считывание координат из coordinatesToBrowser.php и передача новых координат в google maps. Файл coordinatesToBrowser.php напишем ниже.

window.lat = 37.7850; window.lng = -122.4383; var map; var mark; var initialize = function () < map = new google.maps.Map(document.getElementById('map-canvas'), < center: < lat: lat, lng: lng >, zoom: 12 >); mark = new google.maps.Marker(< position: < lat: lat, lng: lng >, map: map >); >; var compare=0; let timerId = setTimeout(function tick() < var xhr = new XMLHttpRequest(); xhr.open('GET', 'coordinatesToBrowser.php', true); xhr.onreadystatechange = function() < if (xhr.readyState == 4 && xhr.status == 200) < var jsonObj=JSON.parse(xhr.responseText); const arr = Object.keys(jsonObj).map((key) =>[key, jsonObj[key]]); lat= parseFloat(arr[0][1]); lng= parseFloat(arr[1][1]); if(compare!=lat)< map.setCenter(< lat: lat, lng: lng, alt: 0 >); mark.setPosition(< lat: lat, lng: lng, alt: 0 >); > compare=lat; > > xhr.send(null); timerId = setTimeout(tick, 2000); >, 2000);

3. Все файлы заливаете на свой хост. Далее переходим в php MyAdmin. Создаете базу данных или используете уже созданную автоматически. В ней создаете таблицу под названием coordinates. В этой таблице создаете 3 столбца: id, latitude и longitude как на изображении.

4. Далее в папку сайта на хостинг помещаете два php файла, которые будут взаимодействовать с базой данных, а именно таблицей coordinates. Файл coordinatesToBrowser.php будет считывать координаты из базы, а coordinatesFromAndroid.php будет записывать переданные android устройством координаты в базу данных.

coordinatesToBrowser.php В 15 строчке происходит выборка из созданной нами таблицы coordinates, а именно из столбцов latitude и longitude. Подключение к самой базе данных прокомментировано в коде.

 else<> $sql = mysqli_query($link, "SELECT * FROM coordinates"); if ($sql) < $row = $sql->fetch_assoc(); $lat=$row['latitude']; $lon=$row[' else<> $sql = mysqli_query($link, "SELECT * FROM coordinates"); if ($sql) < $row = $sql->fetch_assoc(); $lat=$row['latitude']; $lon=$row['longitude']; $cart = array( "latitude" => $lat, "longitude" => $lon, ); echo json_encode( $cart ); > else < // echo '

Произошла ошибка: ' . mysqli_error($link) . '

'; > ?>]; $cart = array( "latitude" => $lat, "longitude" => $lon, ); echo json_encode( $cart ); > else < // echo '

Произошла ошибка: ' . mysqli_error($link) . '

'; > ?>

coordinatesFromAndroid.php. В 22 строчке идет перезапись столбцов новыми значениями.

 else < if (!empty($_POST["Latitude"]&&!empty($_POST["Longitude"])))< $Latitude=$_POST["Latitude"]; $Longitude=$_POST["Longitude"]; >$sql = mysqli_query($link, "UPDATE coordinates SET latitude='$Latitude', longitude='$Longitude' WHERE "); if ($sql) < // echo '

Данные успешно добавлены в таблицу.

'; > else < // echo '

Произошла ошибка: ' . mysqli_error($link) . '

'; > > ?>

5. Заключительным этапом мы создадим андроид приложение, которое будет передавать координаты каждые 2 секунды во время движения. Приложение запускает сервис, который запрашивает текущие координаты у встроенного gps приемника. Для работы в фоновом режиме необходимо стороннее приложение, например такси или карты, при работе которых в верхней панели отображается ‘самолетик’ (геолокация). Несмотря на то, что сервис очень живучий в приложении предусмотрен менеджер, перезапускающий сервис каждые 30 секунд на случай, если андроид очистит от него память.

Итак скачиваем и устанавливаем среду разработки приложений Android Studio.

Создаете новый проект, выбрав empty Activity

Называете приложение и выбираете язык Java

В баре слева выбираете App -> res -> layout открываете файл activity_main.xml и меняете его содержимое на:

activity_main.xml Файл представляет собой внешний вид страницы приложения. На нем расположены кнопки Получить координаты и Сбросить координаты, а также текстовые поля для отображения координат и региона.

Далее App ->manifest открываете файл AndroidManifest.xml и меняете его содержимое на:

AndroidManifest.xml Файл несет в себе информацию о приложении для операционной системы. В него включены данные об активити, сервисах, разрешениях и другом. Оставляете свой package=»yourpackage» строчка 3.

Далее снова App -> res -> values открываете файл colors.xml и меняете его содержимое на:

colors.xml В файле задаются цвета элементов.

  #6200EE #3700B3 #03DAC5 #808040 #868602 

Далее Gradle Scripts открываете файл build.grande(Module app) и меняете его содержимое на:

build.grande(Module app) В файле информация о сборке проекта и его зависимостях. В строчке 5 оставляете свой applicationId.

apply plugin: 'com.android.application' android < compileSdkVersion 30 buildToolsVersion "30.0.2" defaultConfig < applicationId "yourPackage" minSdkVersion 16 targetSdkVersion 30 versionCode 1 versionName "1.0" multiDexEnabled true testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" useLibrary 'org.apache.http.legacy' // Библиотека для HTTP Client >buildTypes < release < minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' >> 

Далее снова App -> Java -> YourPackage открываете файл MainActivity.java и меняете его содержимое на:

MainActivity.java В этом файле код основного активити. Строку 1 оставляете свою. В файле проходит инициализация кнопок, текстовых полей. Инициализация AlarmManager, который ‘пробуждает’ основной сервис. Обработка нажатия кнопок. Обработка разрешений от пользователя. Прием и отображение координат и региона. Запуск сервиса GoogleService , который запрашивает gps координаты осуществляется в обработчике нажатия кнопки btn_start. Сброс координат в значение по умолчанию осуществляется в обработчике кнопки btn_finish. Сам GoogleService и AlarmManager опишем ниже.

package yourpackage; import android.Manifest; import android.app.Activity; import android.app.AlarmManager; import android.app.PendingIntent; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; import android.content.SharedPreferences; import android.content.pm.PackageManager; import android.location.Address; import android.location.Geocoder; import android.os.Bundle; import android.preference.PreferenceManager; import android.view.View; import android.widget.Button; import android.widget.TextView; import android.widget.Toast; import androidx.core.app.ActivityCompat; import androidx.core.content.ContextCompat; import java.io.IOException; import java.util.Calendar; import java.util.List; import java.util.Locale; public class MainActivity extends Activity < public static boolean stsrtFinish = true; Button btn_start; Button btn_finish; private static final int REQUEST_PERMISSIONS = 100; boolean boolean_permission; TextView tv_latitude, tv_longitude, tv_address, tv_area, tv_locality; SharedPreferences mPref; SharedPreferences.Editor medit; Double latitude, longitude; Geocoder geocoder; @Override protected void onCreate(Bundle savedInstanceState) < super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); final AlarmManager alarmMgr = (AlarmManager)getSystemService(Context.ALARM_SERVICE); final Intent intent = new Intent(this, MyAlarmReceiver.class); final PendingIntent pendingIntent = PendingIntent.getBroadcast(this, 0, intent, 0); Calendar time = Calendar.getInstance(); time.setTimeInMillis(System.currentTimeMillis()); time.add(Calendar.SECOND, 5); alarmMgr.setRepeating(AlarmManager.RTC_WAKEUP, time.getTimeInMillis(),3000, pendingIntent); btn_start = (Button) findViewById(R.id.btn_start); btn_finish = (Button) findViewById(R.id.btn_finish); tv_address = (TextView) findViewById(R.id.tv_address); tv_latitude = (TextView) findViewById(R.id.tv_latitude); tv_longitude = (TextView) findViewById(R.id.tv_longitude); tv_area = (TextView) findViewById(R.id.tv_area); tv_locality = (TextView) findViewById(R.id.tv_locality); geocoder = new Geocoder(this, Locale.getDefault()); mPref = PreferenceManager.getDefaultSharedPreferences(getApplicationContext()); medit = mPref.edit(); btn_finish.setOnClickListener(new View.OnClickListener() < @Override public void onClick(View v) < stsrtFinish = false; alarmMgr.cancel(pendingIntent); >>); btn_start.setOnClickListener(new View.OnClickListener() < @Override public void onClick(View v) < if (boolean_permission) < medit.putString("service", "service").commit(); Intent intent = new Intent(getApplicationContext(), GoogleService.class); startService(intent); >else < Toast.makeText(getApplicationContext(), "Please enable the gps", Toast.LENGTH_SHORT).show(); >> >); fn_permission(); > private void fn_permission() < if ((ContextCompat.checkSelfPermission(getApplicationContext(), android.Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED)) < if ((ActivityCompat.shouldShowRequestPermissionRationale(MainActivity.this, android.Manifest.permission.ACCESS_FINE_LOCATION))) < >else < ActivityCompat.requestPermissions(MainActivity.this, new String[], REQUEST_PERMISSIONS); > > else < boolean_permission = true; >> @Override public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) < super.onRequestPermissionsResult(requestCode, permissions, grantResults); switch (requestCode) < case REQUEST_PERMISSIONS: < if (grantResults.length >0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) < boolean_permission = true; >else < Toast.makeText(getApplicationContext(), "Please allow the permission", Toast.LENGTH_LONG).show(); >> > > private BroadcastReceiver broadcastReceiver = new BroadcastReceiver() < @Override public void onReceive(Context context, Intent intent) < latitude = Double.valueOf(intent.getStringExtra("latutide")); longitude = Double.valueOf(intent.getStringExtra("longitude")); List addresses = null; try < addresses = geocoder.getFromLocation(latitude, longitude, 1); String cityName = addresses.get(0).getAddressLine(0); String stateName = addresses.get(0).getAddressLine(1); String countryName = addresses.get(0).getAddressLine(2); tv_area.setText(addresses.get(0).getAdminArea()); tv_locality.setText(stateName); tv_address.setText(countryName); >catch (IOException e1) < e1.printStackTrace(); >tv_latitude.setText(latitude + ""); tv_longitude.setText(longitude + ""); tv_address.getText(); > >; @Override protected void onResume() < super.onResume(); registerReceiver(broadcastReceiver, new IntentFilter(GoogleService.str_receiver)); if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) < return; >> @Override protected void onStart() < super.onStart(); >@Override protected void onPause() < super.onPause(); >@Override protected void onStop() < super.onStop(); >@Override protected void onDestroy() < super.onDestroy(); unregisterReceiver(broadcastReceiver); >>

Далее Далее снова App -> Java -> YourPackage нажимаете правую кнопку мыши, во всплывающем меню создаете новый Java class и называете его GoogleService.java.

GoogleService.java Строку 1 оставляете свою. Файл представляет собой сервис, работающий в фоновом режиме, который принимает gps координаты с помощью LocationManager. В методе onLocationChanged идет передача координат на ваш сервер HttpPost post = new HttpPost(«https://yourSite.ru/coordinatesFromAndroid.php») Адрес сайта поменяйте на свой строка 90.

package yourpackage; import android.Manifest; import android.app.Service; import android.content.Intent; import android.content.pm.PackageManager; import android.location.Location; import android.location.LocationListener; import android.location.LocationManager; import android.os.Bundle; import android.os.IBinder; import android.util.Log; import androidx.annotation.Nullable; import androidx.core.app.ActivityCompat; import org.apache.http.util.EntityUtils; import com.google.gson.JsonObject; import org.apache.http.HttpEntity; import org.apache.http.HttpResponse; import org.apache.http.NameValuePair; import org.apache.http.client.HttpClient; import org.apache.http.client.entity.UrlEncodedFormEntity; import org.apache.http.client.methods.HttpPost; import org.apache.http.impl.client.DefaultHttpClient; import org.apache.http.message.BasicNameValuePair; import org.apache.http.params.BasicHttpParams; import org.apache.http.params.HttpConnectionParams; import org.apache.http.params.HttpParams; import org.apache.http.protocol.HTTP; import java.io.IOException; import java.util.ArrayList; import java.util.List; public class GoogleService extends Service implements LocationListener < private JsonObject message; boolean isGPSEnable = false; double latitude, longitude; LocationManager locationManager; public static String str_receiver = "servicetutorial.service.receiver"; Intent intent; List params; public GoogleService() < >@Nullable @Override public IBinder onBind(Intent intent) < return null; >@Override public void onCreate() < super.onCreate(); intent = new Intent(str_receiver); message = new JsonObject(); params = new ArrayList(); locationManager = (LocationManager) getApplicationContext().getSystemService(LOCATION_SERVICE); isGPSEnable = locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER); if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) < return; >locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 2000, 10, this); > @Override public void onLocationChanged(Location location) < params = new ArrayList(); if (isGPSEnable) < if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) < return; >location = locationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER); if (location!=null) < Log.e("location!=null", "location!=null"); message.addProperty("lat", location.getLatitude()); message.addProperty("lng", location.getLongitude()); if(MainActivity.stsrtFinish) < params.add(new BasicNameValuePair("Latitude", String.valueOf(location.getLatitude()))); params.add(new BasicNameValuePair("Longitude", String.valueOf(location.getLongitude()))); >else < params.add(new BasicNameValuePair("Latitude", "37.7850")); params.add(new BasicNameValuePair("Longitude", "-122.4383")); >new Thread(new Runnable() < public void run() < try < HttpParams httpParameters = new BasicHttpParams(); HttpConnectionParams.setConnectionTimeout(httpParameters, 10000); HttpConnectionParams.setSoTimeout(httpParameters, 10000); HttpClient httpClientpost = new DefaultHttpClient(httpParameters); HttpPost post = new HttpPost("https://yourSite.ru/coordinatesFromAndroid.php"); UrlEncodedFormEntity ent = new UrlEncodedFormEntity(params, HTTP.UTF_8); post.setEntity(ent); HttpResponse responsePOST = httpClientpost.execute(post); HttpEntity resEntity = responsePOST.getEntity(); String getresponse = EntityUtils.toString(resEntity); //Response from the server Log.e("response",getresponse); >catch (IOException e) < e.printStackTrace(); Log.e("catch","catch"); >> >).start(); latitude = location.getLatitude(); longitude = location.getLongitude(); fn_update(location); > > > @Override public void onStatusChanged(String provider, int status, Bundle extras) <> @Override public void onProviderEnabled(String provider) < >@Override public void onProviderDisabled(String provider) < >private void fn_update(Location location) < intent.putExtra("latutide",location.getLatitude()+""); intent.putExtra("longitude",location.getLongitude()+""); sendBroadcast(intent); >>

Далее Далее снова App -> Java -> YourPackage нажимаете правую кнопку мыши, во всплывающем меню создаете новый Java class и называете его MyAlarmReceiver.java.

MyAlarmReceiver.java Строку 1 оставляете свою. Код в этом файле запускается каждые 30 секунд. Таким образом происходит перезапуск GoogleService, в случае если сервис перестал работать.

package yourpackage; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; public class MyAlarmReceiver extends BroadcastReceiver < @Override public void onReceive(Context context, Intent intent)< context.startService(new Intent(context, GoogleService.class)); >>

Далее включаете на своем андроид телефоне режим разработчика, подключаетесь через usb к компьютеру, в окошке Devices отобразится название вашего телефона. Нажимаете кнопку пуск. Начнется сборка и установка приложения на телефон. Если все прошло без ошибок, значит ваш сервис работает так же как и мой. Работу сервиса можете увидеть на сайте https://gaselka71.ru

Для тех, кому нравится видеоформат можете посмотреть плейлист по этой теме на моем канале:

Всем спасибо за внимание. Желаю удачи!

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *