- Геолокация android java погода
- Работаем с GPS в Android на Java
- Простой способ добавить геолокацию в свой проект для Android
- Создаём приложение “прогноз погоды” на Android
- 1. Подготовка
- 2. Создадим новый проект
- 3. Добавим пользовательский шрифт
- 4. Отредактируем файл манифеста
- 5. Отредактируем макет Activity
- 6. Отредактируем макет Fragment
- 7. Изменим strings.xml
- 8. Добавим пункт меню
- 9. Получаем данные из OpenWeatherMap
- 10. Сохраним город в настройках
- 11. Создадим Fragment
- 12. Редактируем Activity
- Заключение
Геолокация android java погода
Мы все пользуемся на своих устройствах приложениями, показывающими прогноз погоды. На Play Market можно найти бесконечное множество таких программ, хотя далеко не все они нам нравятся. И сегодня мы научимся делать своей собственное приложение, которое будет радовать нас прогнозами погоды. Согласитесь, смотреть погоду в смартфоне через свое приложение куда приятнее, чем с всех остальных. У нас должно получиться примерно так:
Создаем новый проект, традиционно названия я оставлю стандартными. Выбираем минимальную версию для запуска Android 2.2, выбираем Blank Activity.
Сразу открываем файл манифеста AndroidManifest.xml и добавим нашему приложению разрешение на использование Интернета:
Чтобы упростить работу над приложением, будет использовать только портретный вид для нашего Activity:
Отредактируем файл activity_main.xml. Здесь нас ждет не много работы. Создадим FrameLayout и зададим цвет его фона:
Теперь создадим 5 элементов TextView, в которых будет отображаться следующая информация:
— иконка, соответствующая текущей погоде;
— временная отметка, указывающая, когда было сделано последнее обновление данных о погоде;
— более детальная информация о погоде (влажность и т.п).
Для размещения этих элементов мы воспользуемся RelativeLayout. Для этого создаем в папке layout приложения файл по имени fragment_weather.xml и добавляем в него код:
Теперь давайте отредактируем строковые ресурсы, которые будем использовать, в файле strings.xml:
Теперь отредактируем меню нашего приложения. В нем будет пункт, позволяющий пользователю выбрать нужный город. Открываем файл menu_main.xml и добавляем следующий код:
На этом вся работа в layout файлах завершена. Теперь нам предстоит настроить сам процесс получения и отображения информации о погоде.
Мы можем получить информацию о погоде любого города с помощью OpenWeatherMap API инструментов. Например, чтобы получить информацию о состоянии погоды в австралийском городе Канберра, мы делаем вот такой запрос. Ответ, который мы получаем, выглядит примерно так:
Давайте создадим еще один java класс по имени Weather.java. Этот класс как раз и будет отвечать за отбор нужной информации из результата запроса к OpenWeatherMap API.
Мы используем класс HttpURLConnection для того, чтобы сделать запрос. BufferedReader используется для чтения ответа на запрос. Когда ответ получен, мы преобразовываем его в объект JSONObject. Если запрос выполнен и результаты успешно получены, то JSON данные будут содержать поле по имени cod со значением 200 (смотрим пример кода выше, вверху). Мы будем использовать это значение для проверки, получен ответ или нет. Чтобы воплотить все вышесказанное в программе, добавляем в файл Weather.java следующий код:
Нам нужно позаботиться о том, чтобы пользователю не пришлось каждый раз вводить желаемый город для получения для него погодных данных. Приложение должно запоминать город, выбранный в последний раз пользователем. Мы дадим ему такую функцию, используя SharedPreferences. Для реализации этой задачи создадим дополнительный вспомогательный класс.
Создаем новый класс под названием City.java. Для сохранения и извлечения данных о нужном городе, будут использоваться два метода: setCity и getCity. Объект SharedPreferences объявляется в конструкторе. Класс City.java должен выглядеть примерно так:
Создаем еще один java класс по имени WeatherFragment.java. Как свой интерфейс, этот класс будет использовать файл fragment_weather.xml. В этом классе мы объявляем 5 объектов TextView и инициализируем их в методе onCreateView, также будет использоваться объект Thread для того, чтобы позволить приложению получать данные от OpenWeatherMap API асинхронно. Также нас нужен объект Handler. Добавляем в WeatherFragment.java следующий код:
Также в методе onCreate мы вызываем метод updateWeatherData:
Пока что все светит красным, но не отчаиваемся:). В методе updateWeatherData мы делаем запрос, вызываем getJSON. Добавляем описание этого метода:
Метод renderWeather использует данные с JSON для обновления объектов в TextView. Ответ от сервиса погоды получается как массив данных. Мы будем использовать только первый элемент этого массива. Создаем метод renderWeather:
Под конец указанного выше метода мы вызвали setWeatherIcon, указав ID текущей погоды. Это нужно настроить для того, чтобы пользователь видел при соответствующей погоде соответствующее ей изображение. Например:
— значения в области 200 относятся к грозе, а значит мы будем использовать строку R.string.weather_thunder ;
— значения в области 300 относятся к морозу, здесь мы используем R.string.weather_drizzle ;
— значение а области 500 соответствует дождю, мы используем R.string.weather_rain ;
Добавляем выполнение метода setWeatherIcon:
И под конец, добавим в этот класс еще один метод — метод, позволяющий пользователю менять город:
Осталось немного поработать в файле MainActivity.java. Заменим в нем метод onCreate на этот код:
Далее нужно отредактировать метод onOptionsItemSelected, который будет вызывать меню с опцией выбора нужного пользователю города. Для реализации функции ввода названия нужного города мы будем использовать Alert Dialog, в котором предложим пользователю ввести название необходимого города:
На этом работа на приложением завершена. Можете переходить в тестированию своего приложения на эмуляторе либо устройстве.
Надеюсь урок был вам чем то полезен. Удачи!
Источник
Работаем с GPS в Android на Java
Мобильные устройства часто используются для решения различных задач связанных с определением географических координат. Транспорт, строительство, путешественники, так или иначе, нуждаются в определении своего местоположения или других объектов.
На сегодняшний день самым простым решением для этого является использование портативных приёмников спутниковых навигационных систем, в частности встраиваемых в устройства на базе Android. При этом наиболее распространёнными являются устройства с поддержкой системы GPS.
В Android SDK весь функционал по работе с навигационными системами объединён в пакет android.location. Ключевые компоненты данного пакета:
- LocationManager – (класс) обеспечивает доступ к системной службе определения местоположения Android;
- LocationListener — (интерфейс) регламентирует обработку приложение событий службы определения местоположения Android;
- Location – (класс) представляет географические координаты полученные от навигационной системы.
Подготовка к работе
При написании Android приложения работающего с навигационными системами на Java с помощью Android SDK вначале необходимо выполнить ряд подготовительных операций.
Это связано с тем, что в отличие от Delphi, здесь отсутствуют какие-либо разрешения, предоставляемые по умолчанию и нет готовых компонентов, которые полностью брали бы на себя всю работу по взаимодействию с GPS приёмником.
Все необходимые действия потребуется выполнить самостоятельно.
Первым делом предоставляем приложению необходимые разрешения в файле манифеста.
Далее создаём в коде приложения объект LocationListener для обработки событий службы определения местоположения Android.
Назначение его методов – обработка соответствующих событий. Конкретно:
- onLocationChanged – изменение местоположения. Именно он используется для определения текущих географических координат;
- onStatusChanged – изменение состояния поставщика данных о местоположении. В частности приёмника GPS;
- onProviderEnabled – получение доступа к поставщику данных о местоположении;
- onProviderDisabled – потеря доступа к поставщику данных о местоположении.
В завершение зарегистрируем созданный нами объект LocationListener для работы с приёмником GPS.
Для этого создаём экземпляр класса LocationManager.
И выполняем регистрацию при помощи метода requestLocationUpdates.
Перед вызовом метода requestLocationUpdates обязательно необходимо проверить наличие соответствующих разрешений (оператор if). Если они отсутствуют перед оператором return можно выполнить некоторые действия. Например, записать сообщение об ошибке в журнал. Однако в любом случае при отсутствии необходимых разрешений работа с навигационной системой должна быть завершена до регистрации объекта LocationListener.
Метод requestLocationUpdates имеет несколько перегрузок. Наиболее часто используемая из них принимает четыре параметра. Именно она использована в примере выше.
- Поставщик данных о местоположении.
В данном примере используется GPS; - Минимальный интервал обновления данных о местоположения в миллисекундах.
Значение «0» соответствует использованию минимально возможного интервала времени для данного устройства; - Минимальное расстояние для обновления данных о местоположении в метрах.
Значение «0» соответствует использованию минимально возможного расстояния для данного устройства; - Регистрируемый объект LocationListener.
После регистрации приложение сможет получать информацию о местоположении устройства по мере его изменения.
Если необходимо получить её единовременно, необходимо вместо метода requestLocationUpdates использовать метод requestSingleUpdate, который также имеет несколько перегрузок.
Наиболее востребованная из них принимает три параметра:
- Поставщик данных о местоположении.
В данном примере используется GPS; - Регистрируемый объект LocationListener;
- Объект, реализующий обратный вызов.
Необязательный параметр.
Пример использования метода requestSingleUpdate:
Источник
Простой способ добавить геолокацию в свой проект для Android
Долго я прочёсывал интернет в поисках простого решения, как мне в проект добавить 1 только класс и больше не беспокоиться о проблемах геолокации.
Критерии были такие:
1) решить всё в 1 классе, как можно меньше используя внешний код.
2) у пользователя должна быть всегда под рукой 1 static переменная в которой указанно его местоположение и больше ни о чём он знать не должен.
Большинство постов не отвечало на поставленный вопрос: конечно сначала нужно обратиться к сервису, потом нужно установить listner, потом вы можете посмотреть на трёхстраничный краткий пример как это делать.
В итоге я написал свой класс, с которым и хочу вас познакомить: он прост в использовании и с ним сможет справиться любой: просто добавьте его в проект и будет вам счастье.
Итак, что же здесь есть?
Класс разделен на 3 части:
1) imHere — переменная типа Location, в которой будет всегда доступна самая последняя информация о местоположении пользователя.
2) функция SetUpLocationListener — в любом случае нам нужна будет начальная установка для того, чтобы система начала сама без нашего участия выполнять обновление переменной imHere.
3) все остальные обязательные части LocationListener, которые можно переделать по собственному желанию.
Итак, как это работает?
1) создаем класс MyLocationListener
2) копируем в него код написанный выше
3) в основной функции (например MainActivity) ближе к началу запускаем:
или для любителей потоков
4) теперь у нас всегда и в любой части нашего проекта есть переменная MyLocationListener.imHere типа Location, в которой хранится самое последнее местоположение пользователя и множество дополнительной информации, как например скорость или точность определения местоположения.
И в заключение: это принципиальный код и тут есть что улучшать. Например нужно учитывать, что первое время локация может быть не определена и imHere будет null, но это всё не скоро: сейчас у нас есть класс, который позволяет нам без лишних усилий и с минимумом знаний добавить геолокацию в свой проект.
(!) Не забудьте: в зависимости от выбранного провайдера нужно добавить в манифест соответствующее разрешение. Например используемый выше GPS_PROVIDER требует добавления следующей строчки в манифест:
Источник
Создаём приложение “прогноз погоды” на Android
Многие популярные приложения прогноза погоды в Google Play либо содержат много рекламы, либо требуют слишком большого количества разрешений, либо содержат функционал, который большинство из нас никогда не используют. Было бы здорово, если бы мы могли создать собственное приложение погоды с нуля?
В этом уроке я покажу вам, как это сделать. Наше приложение будет иметь простой и минималистичный пользовательский интерфейс, показывающий пользователю именно то, что ему нужно знать о текущих погодных условиях. Давайте начнем.
1. Подготовка
Прежде чем продолжить, дважды проверьте, что у вас установлены следующие компоненты:
- Eclipse ADT Bundle: вы можете скачать его на веб-сайте разработчика Android.
- Ключ APIOpenWeatherMap : это не обязательно для выполнения нашей задачи, но это бесплатно. Вы можете получить его, зарегистрировавшись на сайте OpenWeatherMap.
- Иконки: Я рекомендую вам скачать шрифт weather icons font, созданный Эриком Флорсом. Вам нужно загрузить файл TTF, потому что мы будем использовать его в нативном приложении. Мы будем использовать этот шрифт чтобы показывать различные значки в зависимости от погодных условий.
2. Создадим новый проект
Я собираюсь назвать это приложение SimpleWeather, но вы можете дать ему любое имя, которое вам понравится. Введите уникальное имя пакета, установите минимальный необходимый SDK на Android 2.2 и установите целевой SDK на Android 4.4. Вы можете оставить тему Holo Dark.
Это приложение будет иметь только одно Activity , и оно будет основано на шаблоне Blank Activity, как показано ниже.
Назовите Activity WeatherActivity. Мы будем использовать Fragment внутри этого Activity . Макет, связанный с Activity называется activity_weather.xml. Макет, связанный с Fragment называется fragment _weather.xml.
3. Добавим пользовательский шрифт
Скопируйте weathericons-regular-webfont.ttf в каталог assets/fonts вашего проекта и переименуйте его в weather.ttf.
4. Отредактируем файл манифеста
Единственное разрешение, которое требуется этому приложению — это android.permission.INTERNET .
Чтобы упростить этот урок, мы рассмотрим только портретный режим. Узел activity манифеста должен выглядеть так:
5. Отредактируем макет Activity
В activity_weather.xml изменений не так много. Он должен уже включать в себя FrameLayout . Добавьте дополнительное свойство, чтобы изменить цвет фона на #FF0099CC .
6. Отредактируем макет Fragment
Измените файл fragment_weather.xml, добавив пять тегов TextView , чтобы отобразить следующую информацию:
- город и страна
- текущая температура
- значок, показывающий текущее погодное условие
- отметка времени, указывающая пользователю, когда было получено последнее обновление информация о погоде
- более подробная информация о текущей погоде, например, описание и влажность
Используйте RelativeLayout для размещения текстовых представлений. Вы можете настроить textSize для различных устройств.
7. Изменим strings.xml
Этот файл содержит строки, используемые в нашем приложении, а также коды символов Юникода, которые мы будем использовать для отображения значков погоды. Приложение сможет отображать восемь различных типов погодных условий. Если вам нужно больше, примените следующую хитрость. Добавьте следующие значения в файл values/strings.xml:
8. Добавим пункт меню
Пользователь должен иметь возможность выбирать город, чью погоду они хотят видеть. Измените файл menu/weather.xml и добавьте элемент для этой опции.
Теперь, когда все XML-файлы готовы к использованию, давайте перейдем к запросу на API OpenWeatherMap для получения данных о погоде.
9. Получаем данные из OpenWeatherMap
Мы можем получить текущие данные о погоде в любом городе, в формате JSON, с помощью API OpenWeatherMap. В строке запроса мы передаем имя города и систему измерения, в которой должны быть результаты.
Например, чтобы получить текущую информацию о погоде в Канберре, используя метрическую систему, мы отправляем запрос на http://api.openweathermap.org/data/2.5/weather?q=Canberra&units=metric
Ответ, который мы получаем через API, выглядит так:
Создайте новый класс Java и назовите его RemoteFetch.java. Этот класс отвечает за получение данных о погоде через API OpenWeatherMap.
Мы используем класс HttpURLConnection для выполнения удаленного запроса. API OpenWeatherMap ожидает ключ API в HTTP-заголовке с именем x-api-key . Это определено в нашем запросе с использованием метода setRequestProperty .
Мы используем BufferedReader для чтения ответа API в StringBuffer . Когда мы получим полный ответ, мы преобразуем его в объект JSONObject .
Как видно из приведенного выше ответа, данные JSON содержат поле с именем cod . Его значение равно 200 , если запрос был успешным. Мы используем это значение, чтобы проверить, имеет ли ответ JSON текущую информацию о погоде или нет.
Класс RemoteFetch.java должен выглядеть следующим образом:
10. Сохраним город в настройках
Пользователь не должен указывать имя города каждый раз, когда захочет использовать приложение. Приложение должно запомнить последний город, который искал пользователь. Мы делаем это, используя SharedPreferences . Однако вместо прямого доступа к этим настройкам из нашего класса Activity , для этого лучше создать отдельный класс.
Создайте новый класс Java и назовите его CityPreference.java. Чтобы сохранить и получить имя города, создайте два метода setCity и getCity . Объект SharedPreferences инициализируется в конструкторе. Класс CityPreference.java должен выглядеть следующим образом:
11. Создадим Fragment
Создайте новый класс Java и назовите его WeatherFragment.java. В этом фрагменте в качестве макета используется frag_weather.xml. Объявите пять объектов TextView и инициализируйте их в методе onCreateView . Объявите новый объект Typeface с именем weatherFont . Объект TypeFace указывает на веб-шрифт, который вы загрузили и сохранили в папке assets/fonts.
Мы будем использовать отдельный Thread для асинхронного получения данных через API OpenWeatherMap. Мы не можем обновить пользовательский интерфейс из подобного фонового потока. Поэтому нам нужен объект Handler , который мы инициализируем в конструкторе класса WeatherFragment .
Инициализируем объект weatherFont , вызывая createFromAsset в классе Typeface . Мы также вызываем метод updateWeatherData в onCreate .
В updateWeatherData , мы запускаем новый поток и вызываем getJSON в классе RemoteFetch . Если значение, возвращаемое getJSON , равно null , мы выводим сообщение об ошибке пользователю. Если это не так, мы вызываем метод renderWeather .
Только основной поток разрешает обновлять пользовательский интерфейс приложения для Android. Вызов Toast или renderWeather прямо из фонового потока приведет к ошибке выполнения. Вот почему мы вызываем эти методы с использованием метода post — обработчика .
Метод renderWeather использует данные JSON для обновления объектов TextView . Узел weather ответа JSON представляет собой массив данных. В этом уроке мы будем использовать только первый элемент массива метеорологических данных.
В конце метода renderWeather мы вызываем setWeatherIcon с идентификатором текущей погоды, а также временем восхода и захода солнца. Настройка значка погоды немного сложна, потому что API OpenWeatherMap поддерживает больше погодных условий, чем мы можем отобразить с помощью используемого веб-шрифта. К счастью, идентификаторы погоды следуют шаблону, о котором вы можете узнать больше на веб-сайте OpenWeatherMap.
Так мы будем сопоставлять идентификатор погоды с иконкой:
- коды погоды в диапазоне 200 обозначают грозу, что означает, что мы можем использовать R .string.weather_thunder для них
- коды погоды в диапазоне 300 связаны с моросями, и мы используем R.string.weather_drizzle
- коды погоды в диапазоне 500 означают дождь, и мы используем R.string.weather_rain
- и так далее .
Мы используем время восхода и захода солнца, чтобы отобразить солнце или луну, в зависимости от текущего времени суток и только в том случае, если погода ясная.
Конечно, вы можете обрабатывать больше погодных условий , соответственно изменяя метод setWeatherIcon .
Наконец, добавим метод changeCity к фрагменту, чтобы пользователь мог обновить текущий город. Метод changeCity будет вызываться только из основного класса Activity .
12. Редактируем Activity
В течении настройки проекта, Eclipse заполняет WeatherActivity.java некоторым шаблонным кодом. Замените стандартную реализацию метода onCreate на приведенную ниже, в которой мы используем WeatherFragment . Метод onCreate должен выглядеть следующим образом:
Затем отредактируйте метод onOptionsItemSelected и обработайте единственный параметр меню, который у нас есть. Все, что вам нужно сделать, это вызвать метод showInputDialog .
В методе showInputDialog мы используем AlertDialog.Builder для создания объекта Dialog , который предлагает пользователю ввести имя города. Эта информация передается методу changeCity , который хранит имя города с использованием класса CityPreference и вызывает метод changeCity во фрагменте .
Теперь ваше приложение для погоды готово. Соберите проект и установите его на Android-устройстве для тестирования.
Заключение
Теперь у вас есть полнофункциональное приложение прогноза погоды. Изучайте API OpenWeatherMap для дальнейшего развития вашего приложения. Вы также можете использовать больше значков погоды, так как в примере мы используем только немногие из них.
Источник