Вверх ↑
Этот топик читают: Гость
Ответов: 578
Рейтинг: 14
#1381: 2016-07-27 06:30:50 ЛС | профиль | цитата
Нет ли еще компонентов для работы с GPS
карма: 0

0
Ответов: 497
Рейтинг: 16
#1382: 2016-07-27 16:42:07 ЛС | профиль | цитата
GanjaKyp, походу нет но может поможет
Урок
В этом уроке:

- получаем данные о местоположении



Android устройства могут предоставить нам данные по нашему текущему местоположению. Это, конечно, очень удобно и вовсю используется для, например, пользования картой, получения актуальной для вашей местности информации (прогноз погоды), всевозможных чекинов и пр.

Реализация этого всего вполне проста. Мы вешаем слушателя на провайдера и получаем данные. На данный момент есть два провайдера: GPS и Network.

GPS – тут все понятно, это данные с GPS-спутников.

Network – это координаты, которые можно получить через сотовую связь или WiFi. Для этого провайдера нужен инет.



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



Создадим проект:

Project name: P1381_Location
Build Target: Android 2.3.3
Application name: Location
Package name: ru.startandroid.develop.p1381location
Create Activity: MainActivity



В strings.xml добавим строки:

<string name="provider_gps">GPS</string>
<string name="provider_network">Network</string>
<string name="location_settings">Location settings</string>


Экран main.xml:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
androidrientation="vertical"
android:padding="5dp">
<TextView
android:id="@+id/tvTitleGPS"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/provider_gps"
android:textSize="30sp">
</TextView>
<TextView
android:id="@+id/tvEnabledGPS"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="24sp">
</TextView>
<TextView
android:id="@+id/tvStatusGPS"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="24sp">
</TextView>
<TextView
android:id="@+id/tvLocationGPS"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="24sp">
</TextView>
<TextView
android:id="@+id/tvTitleNet"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="10dp"
android:text="@string/provider_network"
android:textSize="30sp">
</TextView>
<TextView
android:id="@+id/tvEnabledNet"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="24sp">
</TextView>
<TextView
android:id="@+id/tvStatusNet"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="24sp">
</TextView>
<TextView
android:id="@+id/tvLocationNet"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="24sp">
</TextView>
<Button
android:id="@+id/btnLocationSettings"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="10dp"
androidnClick="onClickLocationSettings"
android:text="@string/location_settings">
</Button>
</LinearLayout>
Несколько TextView, в которые мы будем выводить данные, и кнопка для открытия настроек местоположения.



MainActivity.java:

package ru.startandroid.develop.p1381location;

import java.util.Date;

import android.app.Activity;
import android.content.Intent;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.Bundle;
import android.view.View;
import android.widget.TextView;

public class MainActivity extends Activity {

TextView tvEnabledGPS;
TextView tvStatusGPS;
TextView tvLocationGPS;
TextView tvEnabledNet;
TextView tvStatusNet;
TextView tvLocationNet;

private LocationManager locationManager;
StringBuilder sbGPS = new StringBuilder();
StringBuilder sbNet = new StringBuilder();

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
tvEnabledGPS = (TextView) findViewById(R.id.tvEnabledGPS);
tvStatusGPS = (TextView) findViewById(R.id.tvStatusGPS);
tvLocationGPS = (TextView) findViewById(R.id.tvLocationGPS);
tvEnabledNet = (TextView) findViewById(R.id.tvEnabledNet);
tvStatusNet = (TextView) findViewById(R.id.tvStatusNet);
tvLocationNet = (TextView) findViewById(R.id.tvLocationNet);

locationManager = (LocationManager) getSystemService(LOCATION_SERVICE);
}

@Override
protected void onResume() {
super.onResume();
locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER,
1000 * 10, 10, locationListener);
locationManager.requestLocationUpdates(
LocationManager.NETWORK_PROVIDER, 1000 * 10, 10,
locationListener);
checkEnabled();
}

@Override
protected void onPause() {
super.onPause();
locationManager.removeUpdates(locationListener);
}

private LocationListener locationListener = new LocationListener() {

@Override
public void onLocationChanged(Location location) {
showLocation(location);
}

@Override
public void onProviderDisabled(String provider) {
checkEnabled();
}

@Override
public void onProviderEnabled(String provider) {
checkEnabled();
showLocation(locationManager.getLastKnownLocation(provider));
}

@Override
public void onStatusChanged(String provider, int status, Bundle extras) {
if (provider.equals(LocationManager.GPS_PROVIDER)) {
tvStatusGPS.setText("Status: " + String.valueOf(status));
} else if (provider.equals(LocationManager.NETWORK_PROVIDER)) {
tvStatusNet.setText("Status: " + String.valueOf(status));
}
}
};

private void showLocation(Location location) {
if (location == null)
return;
if (location.getProvider().equals(LocationManager.GPS_PROVIDER)) {
tvLocationGPS.setText(formatLocation(location));
} else if (location.getProvider().equals(
LocationManager.NETWORK_PROVIDER)) {
tvLocationNet.setText(formatLocation(location));
}
}

private String formatLocation(Location location) {
if (location == null)
return "";
return String.format(
"Coordinates: lat = %1$.4f, lon = %2$.4f, time = %3$tF %3$tT",
location.getLatitude(), location.getLongitude(), new Date(
location.getTime()));
}

private void checkEnabled() {
tvEnabledGPS.setText("Enabled: "
+ locationManager
.isProviderEnabled(LocationManager.GPS_PROVIDER));
tvEnabledNet.setText("Enabled: "
+ locationManager
.isProviderEnabled(LocationManager.NETWORK_PROVIDER));
}

public void onClickLocationSettings(View view) {
startActivity(new Intent(
android.provider.Settings.ACTION_LOCATION_SOURCE_SETTINGS));
};

}
В onCreate определяем TextView-компоненты и получаем LocationManager, через который и будем работать.



В onResume вешаем слушателя с помощью метода requestLocationUpdates. На вход передаем:

- тип провайдера: GPS_PROVIDER или NETWORK_PROVIDER
- минимальное время (в миллисекундах) между получением данных. Я укажу здесь 10 секунд, мне этого вполне хватит. Если хотите получать координаты без задержек – передавайте 0. Но учитывайте, что это только минимальное время. Реальное ожидание может быть дольше.
- минимальное расстояние (в метрах). Т.е. если ваше местоположение изменилось на указанное кол-во метров, то вам придут новые координаты.
- слушатель, объект locationListener, который рассмотрим ниже

Также здесь обновляем на экране инфу о включенности провайдеров.



В onPause отключаем слушателя методом removeUpdates.



locationListener – слушатель, реализует интерфейс LocationListener с методами:

onLocationChanged – новые данные о местоположении, объект Location. Здесь мы вызываем свой метод showLocation, который на экране отобразит данные о местоположении.

onProviderDisabled – указанный провайдер был отключен юзером. В этом методе вызываем свой метод checkEnabled, который на экране обновит текущие статусы провайдеров.

onProviderEnabled – указанный провайдер был включен юзером. Тут также вызываем checkEnabled. Далее методом getLastKnownLocation (он может вернуть null) запрашиваем последнее доступное местоположение от включенного провайдера и отображаем его. Оно может быть вполне актуальным, если вы до этого использовали какое-либо приложение с определением местоположения.

onStatusChanged – изменился статус указанного провайдера. В поле status могут быть значения OUT_OF_SERVICE (данные будут недоступны долгое время), TEMPORARILY_UNAVAILABLE (данные временно недоступны), AVAILABLE (все ок, данные доступны). В этом методе мы просто выводим новый статус на экран.

Провайдеры включаются и отключаются в настройках системы. Тем самым, просто определяется доступен ли провайдер для получения от него координат. Чуть позже увидим, как можно отправить юзера в эти настройки. Программное включение/выключение провайдеров через стандартные методы недоступно.



Далее идут свои методы.

showLocation на вход берет Location, определяет его провайдера методом getProvider и отображает координаты в соответствующем текстовом поле.

formatLocation на вход берет Location, читает из него данные и форматирует из них строку. Какие данные он берет: getLatitude – широта, getLongitude – долгота, getTime – время определения.

checkEnabled определяет включены или выключены провайдеры методом isProviderEnabled и отображает эту инфу на экране.

Метод onClickLocationSettings срабатывает по нажатию кнопки Location settings и открывает настройки, чтобы пользователь мог включить или выключить провайдер. Для этого используется Intent с action = ACTION_LOCATION_SOURCE_SETTINGS.



Осталось в манифесте прописать разрешение на определение координат - ACCESS_FINE_LOCATION, которое позволит нам использовать и Network и GPS. Также существует разрешение ACCESS_COARSE_LOCATION, но оно дает доступ только к Network-провайдеру.



С кодом все, давайте смотреть, что получилось. Все сохраняем и запускаем приложение.

У меня на планшете сейчас выключен GPS, выключен WiFi, вставлена симка и выключен мобильный интернет.

Запускаю приложение и вижу такую картину:



GPS выключен, Network включен. Но инета нет, поэтому Network мне ничего не дает. Надо включить либо мобильный инет, либо WiFi.



Я включаю WiFi. Проходит секунд 15-20 и инфа с Network пошла



Видим широту, долготу и время.

Напомню, что мы ставили минимальную скорость обновления – 10 сек. Но у меня провайдер Network выдает данные не чаще, чем раз в минуту.



Теперь давайте включим GPS. Для этого мы специально повесили кнопку Location settings, которую надо будет нажать пользователю, чтобы перейти в настройки. Жмем кнопку.



Видим, что GPS выключен, а Network включен. Наше приложение показывало все верно.

Разумеется, GPS можно включать и выключать через быстрые настройки системы (справа сверху). Но не все пользователи об этом знают. А тут мы их точно направим.

Включаем GPS и жмем Назад, чтобы вернуться в приложение.



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

В итоге сигнал пойман и получен результат.





У GPS через какое-то время включился статус 2 (AVAILABLE).



А у Network тишина со статусом. Не знаю, нормально это или нет.



Если с GPS сигналом все ок, то каждые 10 сек вы будете получать инфу о вашем местоположении. Если убрать планшет от окна, получим плохой сигнал: данные могут приходить реже и статус у меня иногда меняется на 1 (TEMPORARILY_UNAVAILABLE).





Прочее

Есть еще третий тип провайдера - PASSIVE_PROVIDER. Сам по себе этот провайдер никакие данные не вернет. Но повесив на него слушателя, вы сможете получать данные о местоположении, когда кто-то еще в системе пытается определить местоположение через обычные провайдеры. Система будет дублировать результаты и вам.



Метод getAllProviders вернет вам список всех доступных провайдеров. Метод getProviders(boolean enabledOnly) вернет либо все, либо только включенные.



Объект Location кроме координат, времени и провайдера имеет еще несколько атрибутов, которые могут прийти и пустыми:

getAccuracy – точность показания в метрах

getAltitude – высота над уровнем моря в метрах

getSpeed – скорость движения в м/с

getBearing – насколько я понял, это угол, на который текущая траектория движения отклоняется от траектории на север. Кто точно знает, напишите, плз, на форуме!



Местоположение можно протестировать и через AVD эмулятор. Для этого надо в Eclipse открыть DDMS (Window > Open Perspective > DDMS) и выбрать вкладку Emulator Control. Внизу будет вкладка Manual, на которой есть поля для ввода координат и кнопка отправки.
карма: 1
        ]  
0
Ответов: 166
Рейтинг: 5
#1383: 2016-07-28 00:43:52 ЛС | профиль | цитата
Все ждут когда выйдет обновление пакета с новым набором кубиков. Никто не в курсе где найти дату в календаре?
карма: 1
Мастер сам устанавливает закон
0
Ответов: 497
Рейтинг: 16
#1384: 2016-07-28 07:59:19 ЛС | профиль | цитата
Noor, стучись к Netspirit. Я больше жду фикса/исправления бага/доработки с версией жабы
карма: 1
        ]  
0
Ответов: 1821
Рейтинг: 168
#1385: 2016-07-28 11:08:09 ЛС | профиль | цитата
Noor, я на днях начну переделывать весь пакет с нуля. При чем, на новый кодогенератор
карма: 5

3
Голосовали:Konst, Dseren, Medvedoc
Ответов: 497
Рейтинг: 16
#1386: 2016-07-28 14:50:09 ЛС | профиль | цитата
Dilma, неплохо было бы на SVN найти местечко для пакета
карма: 1
        ]  
1
Голосовали:Noor
Ответов: 254
Рейтинг: 6
#1387: 2016-09-13 13:23:31 ЛС | профиль | цитата
Помогите разобраться с установкой пакета Android
Пытался установить по вашей схеме. Установил JRE нормально. Ставил и полный и минимальный пакет. Но при запуске эмуляции приложения эмулятор выбивает. Также не получилось обновить компилятор, поскольку ссылка не рабочая на архив. Установить Intel HAXM не могу, так как у меня AMD.
Подскажите ребята как правильно установить.

Редактировалось 1 раз(а), последний 2016-09-13 13:25:37
карма: 0

0
Ответов: 4628
Рейтинг: 749
#1388: 2016-09-13 14:04:55 ЛС | профиль | цитата
Medvedoc писал(а):
Также не получилось обновить компилятор, поскольку ссылка не рабочая на архив

Сейчас при себе нет - завтра выложу.

Если не работает эмулятор - поищи другие. Проверь в BIOS не выключена ли опция "Execute Disable Bit" и соответствует ли процессор для работы с HAXM. Если нет - HAXM нужно удалить (или он сразу не установится?).

Редактировалось 1 раз(а), последний 2016-09-13 14:11:19
карма: 26

1
Голосовали:Vadimluk1
Ответов: 254
Рейтинг: 6
#1389: 2016-09-13 18:42:54 ЛС | профиль | цитата
Netspirit писал(а):
Если не работает эмулятор - поищи другие.

А как привязать другой эмулятор, например BlueStacks, к пакету Android?

Netspirit писал(а):
соответствует ли процессор для работы с HAXM. Если нет - HAXM нужно удалить (или он сразу не установится?)

Он сразу не установился. У меня AMD процессор.
карма: 0

0
Ответов: 4628
Рейтинг: 749
#1390: 2016-09-14 10:44:59 ЛС | профиль | цитата
Залил обновление заново и поправил ссылку.

Medvedoc писал(а):
А как привязать другой эмулятор
А зачем? Скомпилировал приложение - получил файл *.apk. Закидываешь его в эмулятор тем способом, который в нём предусмотрен.
BlueStacks вроде должен появиться в списке эмуляторов запускальщика из пакета автоматически.

Редактировалось 1 раз(а), последний 2016-09-14 10:50:40
карма: 26

1
Голосовали:Vadimluk1
Ответов: 254
Рейтинг: 6
#1391: 2016-09-16 10:23:08 ЛС | профиль | цитата
Netspirit, а нет видео установки пакета? То, что в начале топика перекидывает на файлообменник, но там видео удалено.
карма: 0

0
Ответов: 4628
Рейтинг: 749
#1392: 2016-09-16 16:26:36 ЛС | профиль | цитата
Перезалил.
карма: 26

1
Голосовали:Vadimluk1
Ответов: 166
Рейтинг: 5
#1393: 2016-09-17 23:59:01 ЛС | профиль | цитата
sаmakacd писал(а):
Noor, я на днях начну переделывать весь пакет с нуля. При чем, на новый кодогенератор

Вот это здоровски. А то мне собирать уже пора умный домик.
карма: 1
Мастер сам устанавливает закон
0
Ответов: 578
Рейтинг: 14
#1394: 2016-09-27 07:28:32 ЛС | профиль | цитата
Что то не пойму как использовать предпросмотр Camera, ни у одного компонента не могу найти нижнюю точку SurfaceView
карма: 0

0
Ответов: 1343
Рейтинг: 31
#1395: 2016-10-02 01:36:58 ЛС | профиль | цитата
Что за чертовщина твориться..., создал на ПК сервер, пробую подключиться к нему левой программой с маркета, всё работает, подключаюсь через TCPClient с теми же данными, выдаёт пустой ответ и ничего не происходит

андроид 5.1.1 root (existenz)

когда то создавал приложения типа клиент-сервер и всё работало, щас не могу понять почему даже соединения нет

Редактировалось 1 раз(а), последний 2016-10-02 01:44:29
карма: 2

0
Сообщение
...
Прикрепленные файлы
(файлы не залиты)