Сообщество - Android Developers

Android Developers

90 постов 2 041 подписчик

Популярные теги в сообществе:

31

Моё приложение для заметок и задач. Бесплатное, без рекламы

Моё приложение для заметок и задач. Бесплатное, без рекламы Android, Приложение на Android, Android разработка, Заметки, Google Play

Всем привет!


Я сделал простое и удобное приложение для создания заметок и задач. Оно полностью бесплатно, без рекламы и поддерживает тёмную тему.  Постарался сделать его как можно красивее и минималистичее. Попытался проработать дизайн и UX насколько это возможно и насколько умею.


Пару интересный функций:

- можно синхронизировать данные между устройствами

- можно добавлять тэги и фильтровать по ним

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

- можно добавлять контакты, номера телефонов, геопозиции и ссылки к заметкам и задачам

- ТЕМНАЯ ТЕМА :D


Установить можно с Google Play тут: https://play.google.com/store/apps/details?id=com.tnstudio.c...


Буду рад любым замечаниям либо комментариям,

спасибо!

Показать полностью

Yandex Disk Rest API нужна помощь

Приветствую сообщество. Собственно сабж.

- Зарегистрировал на oauth . yandex . ru свое приложение.

- Среди галок iOS, Android, Web App поставил только Android и получил данные (ID, Пароль, Callback URL)

- В своем манифесте добавил intent-filter из примера:

<intent-filter>

<action android:name="android.intent.action.VIEW" />

<category android:name="android.intent.category.BROWSABLE" />

<category android:name="android.intent.category.DEFAULT" />

<data android:scheme="yandexdisk" />

</intent-filter>

- Для аутентификации использовал URL типа

String AUTH_URL = "https : //oauth . yandex . ru/authorize ? response_type=token & client_id= мой id"

следующим образом

startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse(AUTH_URL)));

- Приложение открывает браузер для авторизации но не возвращается обратно в приложение с сообщением:

Авторизация в приложении не удалась

Возможные причины:

Приложение не установлено - установить

Заранее спасибо за любую помощь


В адресах выставил пробелы, чтобы не работали как ссылки.

3

Буфер обмена в андроид

Привет IT сообществу. Пытаюсь сделать приложение для хранение мемов на андроид. Спасибо этому посту Написал прогу - хранилище мемов за вдохновение. Но столкнулся с проблемой копирование и вставки изображения в буфер. Насколько я понимаю, андроид такого функционала не предоставляет. Может у кого то есть идеи, как это реализовать, или чем заменить. Буду рад любой помощи. Заранее спасибо!

Пытаюсь пойти в геймдев

Всем доброго обеда, на днях у меня созрела идея сделать игру для телефонов. Жанр: текстовый квест. Так вот, прошу вас посоветовать на каком движке все делать? Какой код использовать?

6

Google Play удалил приложение за webview. В чем суть нарушения?

Приложение - игра была собрана в двух версиях для android и html5 функционально идентичные.
Сделал страницу ведущую на html5 версию игры и на андроид версию в гугл плей - https://electronikas.ru/st/
Приложение было опубликовано в Google Play и некоторое время было доступно. Но после того как я добавил на страницу приложения ссылку на свой сайт с игрой, оно было сначала удалено и потом забанено полностью(Suspended).

Во время апелляции отправил в поддержку гугла чек об оплате домена, на котором находится html5 версия игры. После этого приложение разбанили, но оно осталось удаленным(Rejected).

При попытке его опубликовать мне приходит сообщение о нарушении:

Google Play удалил приложение за webview. В чем суть нарушения? Android, Android разработка

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

Google Play удалил приложение за webview. В чем суть нарушения? Android, Android разработка

Из которого я все-равно не понял как это решить..

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

Может кто сталкивался, как решить?

Показать полностью 2
477

Навигатор для прокладки интересных пешеходных маршрутов

Уже довольно долгое время я разрабатываю Sight Safari - навигатор, который строит не самые короткие (как Гугл или Яндекс), а самые интересные пешеходные маршруты.


Вот оказались вы в незнакомом городе и надо вам дойти до метро/вокзала/отеля. Яндекс-Гугл посоветуют вам кратчайший маршрут, но это не очень интересно. Иногда хочется сделать небольшой крюк и по пути пройтись по парку, или мимо каких-нибудь памятников, чтобы совместить дорогу и осмотр достопримечательностей.


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

Навигатор для прокладки интересных пешеходных маршрутов Приложение на Android, Навигация, Туризм, Android разработка, Длиннопост

Мой навигатор решает эту проблему. Строит маршруты, которые длиннее процентов на 20, чем кратчайшие, зато в разы интереснее.


Долгое время сервис жил в виде веб-версии, но пользователи настойчиво просили Android-приложение. Так что пришлось им наконец заняться.


Алгоритм поиска путей


Сперва пара слов о базовой идее. Алгоритм работы у сервиса такой:

1. Парсим Open Street Map

2. Выдираем оттуда объекты, представляющие потенциальный интерес у туристов, используя теги для фильтрации. Например, здания с тегом historic или tourism, объекты с тегом park или garden и т.п.

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

4. Берем популярную библиотечку для поиска путей GraphHopper

5. В областях видимости меняем веса ребер навигационного графа, чтобы маршрутам было выгодно заходить в эти области, а не вести напрямик.


Более подробное описание алгоритма можно найти на Хабре.


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


Osmdroid - тормоза и фризы


Сперва встал вопрос выбора картографического движка. Поскольку данные я беру из Open Street Map, логично использовать и их же карты.


По запросу "OSM Android SDK" первым делом выдает библиотечку osmdroid, которая обещает быть полной заменой стандартного гуглового MapView. Поначалу все было хорошо, встроить по туториалам его удалось достаточно быстро.


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


Поскольку для нашего приложения отображение маркеров очень важно - пришлось искать альтернативу.


Mapbox


Вторым вариантом стал SDK MapBox. У них там есть куча платных фич, однако само использование MapView в своем приложении бесплатно (платно - всякие API типа роутинга, но он у нас свой собственный).


Пришлось немного подхачить отображение маршрутов. Так как их карта ожидает объект в том формате, который возвращает их API, а мы его не используем. Пришлось поковырять структуру их JSON, опытным путем выкинуть все лишнее и завернуть наш собственный маршрут в эту структуру.


В итоге приложение стало выглядеть вот так. Пример показывает, как прямому маршруту по Суворовскому проспекту (он идет под надписью "Пески") приложение предпочло крюк через Таврический сад, где парк и больше всяких памятников и красот:

Навигатор для прокладки интересных пешеходных маршрутов Приложение на Android, Навигация, Туризм, Android разработка, Длиннопост

Немного про UI


На самом деле, работа с картой в таком приложении - самое простое. До меня уже несколько человек пытались на энтузиазме запилить приложение под наше открытое API. Как правило, энтузиазма хватало как раз сделать карту и отображение маршрутов, все ломались на UI. Потому что даже такое вроде бы простое приложение содержит довольно много экранов, форм, поп-апов и прочей скучнейшей и нуднейшей в разработке мутотени.


Вот так выглядит экран прокладки маршрута. Тут надо собрать начальную и конечную точки, сделать возможным добавление и удаление промежуточных точек, причем все это должно работать в двух вариантах - выбором на карте и вводом адреса. Попутно на сервер должны улетать запросы с геокодированием (преобразованием координат в адрес и обратно), с проверкой точек (не выходят ли они за пределы зоны, в которой поддерживается поиск пути) и т.п

Навигатор для прокладки интересных пешеходных маршрутов Приложение на Android, Навигация, Туризм, Android разработка, Длиннопост

И да, кроме прямых маршрутов  (между несколькими точками) есть еще и круговые - с возвратом в стартовую точку за указанное время. Такие маршруты хорошо подходят, если не хочется уходить далеко от какого-то места (отеля, вокзала или просто места встречи с друзьями), есть пара свободных часов и хочется немного погулять.


Но для них - свой набор входных данных и своя форма ввода. Там пользователи хотят указывать область, внутри которой нужно искать достопримечательности, и время.

Пример кругового маршрута по двум паркам на час с небольшим вокруг станции метро "Парк Победы" в Питере:

Навигатор для прокладки интересных пешеходных маршрутов Приложение на Android, Навигация, Туризм, Android разработка, Длиннопост

В Android есть типичная проблема - Activity классы быстро превращаются в этакий God-object, с тысячами строк кода и кучей логики вперемешку с отображением. Бороться с этим призваны всякие хитрые варианты архитектуры. В своем приложении я использовал MVP с помощью библиотечки Moxy. Вкратце - приложение делится на Model (данные), View (отображение, собственно Activity) и Presenter (логика, вынесенная в отдельный класс и работающая с View через интерфейс). На самом деле довольно очевидная вещь, из тех что ты сперва начинаешь сам изобретать, а потом узнаешь что оказывается у нее уже есть какое-то умное название.


Про Moxy есть хорошая статья на Хабре. Главный профит этой библиотечки - что она берет на себя заботу о сохранении состояния приложения и обработку всяких смен ориентации и прочих причин пересоздания Activity. Presenter по сути заполняет очередь команд (на основе бизнес-логики нарисовать то-то там-то, отобразить такой-то поп-ап), которая при необходимости проигрывается заново если Activity была пересоздана.


Заключение


Приложение мы пилили без малого год и все еще продолжаем его допиливать. Работает оно бесплатно и без рекламы, взять можно тут: https://play.google.com/store/apps/details?id=city.sightsafari.android


Из крупного - осталось суметь сделать оффлайн-режим. Это важная фича для путешественников, так как интернет в дороге есть не везде. Но это весьма нетривиально, так как поиск пути у нас сделан довольно сложным и ресурсоемким, не всякий телефон его потянет. Да и кода придется много переносить.


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


Работает пока в 100+ городах России и мира. Оставить заявки на добавление новых городов можно тут в комментариях или в нашей группе ВК.

Навигатор для прокладки интересных пешеходных маршрутов Приложение на Android, Навигация, Туризм, Android разработка, Длиннопост
Показать полностью 5
14

Мое первое Android приложение, Pizza Calculator

Началось все около 2 лет назад я прочитал на Пикабу вот этот пост, в котором расписано, что 2 пиццы по 30см диаметром меньше чем одна на 45см. Почитал комментарии и понял, что людям не хватает в этом вопросе ещё и сравнений веса и длины корочки, вот так у меня и появилось желание написать калькулятор, который все это мог бы посчитать.

На тот момент из опыта в каком-либо программировании у меня были только онлайн курсы по основам C# и пара написанных лаб.

На первую консольную версию приложения я потратил больше месяца, она умела сравнивать любое количество пицц по 4 показателям (площадь, длина корочки, отношение цены к площади и цены к весу), а также умела учитывать едите вы корочку или нет. Сравнение было упрощённым и сопостовляло результаты пиццы к предыдущей в списке (вторую сравниваем с первой, третью со второй и т.д.) Выглядело это вот так:

Мое первое Android приложение, Pizza Calculator Пицца, Калькулятор, Android разработка, Приложение на Android, Длиннопост

Спустя практически год я решил перенести свое творение на Android, сделать приложение с нормальным интерфейсом и полноценным сравнением пицц.

Если бы я начинал делать приложение сейчас, я бы отказался от идеи Xamarin + C# и выбрал бы Java. Полезной информации, гайдов и примеров готового кода для Java гораздо больше и новичку было бы проще, та и Android Studio в плане мобильной разработки удобнее чем Visual Studio.

Первым успехом было приложение с одной кнопкой, которое просто запускалось на моем телефоне. Добавив поля для ввода данных, я столкнулся с первыми серьезными трудностями, я не мог сделать отображение своих объектов (пицц) в списке ListView. Во многих гайдах было описано как отобразить уже заранее созданный список объектов, а для моей ситуации требовалось переписывать базовый адаптер.

Я на этом остановился и месяца три вообще не занимался приложением, пока не узнал что есть список RecyclerView и гайдов про него гораздо больше. Так я нашел блог одного индуса, который описывал как сделать адаптер для RecyclerView и списка List<T>. Мне потребовалось две недели чтобы адаптировать его пример кода под мои нужды: добавить больше информации про объект в списке и картинку. Я использовал CardView и мой список стал немного похож на фид новостей Google:

Мое первое Android приложение, Pizza Calculator Пицца, Калькулятор, Android разработка, Приложение на Android, Длиннопост

В фотошопе я нарисовал интерфейс, который хотел реализовать:

Мое первое Android приложение, Pizza Calculator Пицца, Калькулятор, Android разработка, Приложение на Android, Длиннопост

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

Проблему удалось решить с помощью ConstraintLayout, он позволял указывать размеры в % и закреплять соотношение сторон в нужных пропорциях. Сейчас приложение смотрит на ширину экрана и делает высоту одной карточки как 70% от этого значения, а все остальные элементы настроены уже на нужный процент от высоты или ширины карточки. Также использовался TextView, который изменял размер шрифта в зависимости от размера самого блока TextView, без этого на больших разрешениях экрана текст был очень мелким.

Для главного экрана также были реализованы плавающие кнопки "добавить", "сравнить" и колесо прогресса при загрузке второго экрана с графиками сравнения всех пицц.

Построить графики по нужным данным вроде бы просто, но как добавить к ним взаимодействия, чтобы сравнивать одну пиццу со всеми остальными, а не только 2 с 1 и т.д. Были найдены графики от Syncfusion (не реклама), которые умеют скролится в сторону и одновременно отображать таким образом любое количество нужных расчетов. Также они позволяют взаимодействовать с конкретным столбцом в графике, что после нескольких дней переписок с тех. поддержкой позволило реализовать текущий функционал, когда мы жмём на нужный столбец и эта пицца сравнивает себя со всеми остальными, но уже в процентах. Таким образом можно понять, что площадь пиццы больше, например, на 10%, а дороже она уже на 20%:

Мое первое Android приложение, Pizza Calculator Пицца, Калькулятор, Android разработка, Приложение на Android, Длиннопост

На этом глобальный функционал был окончен, я также добавил несколько мелочей: кастомный шрифт Google NotoSans, адаптивную иконку приложения, перевод на 6 языков (рус, укр, англ, болгарский, чешский и итальянский), спасибо моим друзьям за переводы.

Наступил самый волнительный момент, подготовка приложения и всех сопутствующих материалов к публикации в Play Market. Было заготовлено 5 скриншотов, с короткими подсказками функционала приложения, а также было написано подробное описание. Все это опять требовалось перевести на все необходимые языки и только потом добавлять.

И вот этот день настал, я отдал честно заработанные 25$ за регистрацию учётной записи разработчика для Google Play Console.

Я залил все скриншоты, описание и прочее и столкнулся с новыми проблемами. Требовалась целевая версия Android API 28 (Android Pie), а мое приложение собиралось для API 27. Ну ничего страшного подумал я и скачав нужное SDK пересобрал приложение. И снова ошибка, с 1 августа Google требует обязательное наличие 64 битной версии приложения, пол часа поиска и этот вопрос был решен. Потом Play Console попросила чтобы приложение было собрано как Android App Bundle, а моя Visual Studio 2017 этого не умела и я потратил ещё пол дня чтобы с этим разобраться.

Не смотря на все описанные трудности и два года времени от идеи до реализации приложения, оно наконец-то доступно для всех желающих в Play Market по ссылке. Приложение абсолютно бесплатное и не содержит рекламу.

Буду рад вашим отзывам и постараюсь ответить на все вопросы в комментариях. Если приложение хоть кому-то будет интересно, то сделаю вторую версию с расширенным функционалом и добавленным в базу меню пиццерий ближайших стран.

И напоследок несколько скриншотов:

Мое первое Android приложение, Pizza Calculator Пицца, Калькулятор, Android разработка, Приложение на Android, Длиннопост
Мое первое Android приложение, Pizza Calculator Пицца, Калькулятор, Android разработка, Приложение на Android, Длиннопост
Мое первое Android приложение, Pizza Calculator Пицца, Калькулятор, Android разработка, Приложение на Android, Длиннопост
Мое первое Android приложение, Pizza Calculator Пицца, Калькулятор, Android разработка, Приложение на Android, Длиннопост
Мое первое Android приложение, Pizza Calculator Пицца, Калькулятор, Android разработка, Приложение на Android, Длиннопост
Показать полностью 9
9

Секретный Санта - Время дарить подарки! Исправляем ошибки, рассказываем о работе внутри

Привет, пикабуняне, а также уже будущие Санты!


После последнего поста о начале работы мобильного приложения для обмена подарками Пикабушники, как обычно все поломали (в хорошем смысле):


- Для начала сломали авторизацию, и СМС-ки для регистрации не приходили (поправили почти сразу)

- Потом сломали Блог, Базу знаний, поэтому пришлось отключить (уже включили)


А потом мы сами заметили, что для некоторых версий Android вообще половина функций не работает, и оперативно начали делать обновление 1.0.2. Сейчас оно уже публикуется в Маркете, и скоро ко всем прилетит.


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


Итак..

Секретный Санта - Время дарить подарки! Исправляем ошибки, рассказываем о работе внутри Тайный Санта, Новогодний обмен подарками, Обмен подарками, Длиннопост

И полетели!


Начнем, наверное с Блога (этот для пользователей пк)

Секретный Санта - Время дарить подарки! Исправляем ошибки, рассказываем о работе внутри Тайный Санта, Новогодний обмен подарками, Обмен подарками, Длиннопост

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


*РукаЛицо.jpg


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


Кстати, чтобы далеко не листать, отвечу на вопросы, которые могут возникнуть в комментах:


Обмен платный, стоимость зафиксирована - 75р. Зачем платить, скажете вы - ответ таится в новых особенностях - тотальной проверке пользователя, уведомлениях (по СМС / Звонкам / Отправке писем Почтой с кодом подтверждения / Оплата мощностей Firebase).


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

- Телефон

- ФИО

- Адрес


А значит, намного больше вероятность что обмен будет более гладким. Участвовать или нет - решать вам.


Мы берем с людей деньги, значит и налоги платим? Да, конечно, и еще чеки выдаем. Тут все серьезно


Сколько стран? В этом году 15 стран, в основном это бывший Советский Союз. Сам список ищи в предыдущих постах


Итак, по Блогу.


Сейчас блог - полностью самописный, то есть он не завязан на каком то фреймворке (кроме Bootstrap, но это внешка) типа WordPress, Joomla, или еще чего. За счет этого приходится писать все посты вручную, что конечно отнимает много времени.

Секретный Санта - Время дарить подарки! Исправляем ошибки, рассказываем о работе внутри Тайный Санта, Новогодний обмен подарками, Обмен подарками, Длиннопост

Ну и конечно, лучший друг сейчас - редактор, а в дальнейшем, конечно будем "натягивать" наш шаблон на CMS, чтобы было легче дышать


Кстати, до конца все таки блог на телефоне все еще не работает (Не забирает текст самой записи) - поэтому было придумано самое тупое и простое решение: временно перенаправлять на сайт.


Зато заработал предварительный просмотр записи:

Секретный Санта - Время дарить подарки! Исправляем ошибки, рассказываем о работе внутри Тайный Санта, Новогодний обмен подарками, Обмен подарками, Длиннопост

Далее - как проходит модерация, и звонки для будущих Сант


Порядок, собственно, довольно простой:


- Санта заполняет анкету (нам приходит уведомление)

- Далее происходит процедура внесения регистрационного взноса, и указание времени звонка (с большинством уже связались), после чего мы и созваниваемся.


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


Запрос на звонок нам приходит совсем простой: (замазал некоторые данные, в итоге все оказалось замазано :0 )

Секретный Санта - Время дарить подарки! Исправляем ошибки, рассказываем о работе внутри Тайный Санта, Новогодний обмен подарками, Обмен подарками, Длиннопост

Кстати, пользователи у нас не ранжируются как таковые (Витя, Маша, Петя). То есть у нас есть  уникальный id, по которому уже известно все остальное. При необходимости можно найти Санту по номеру телефона (повторяющихся номеров тоже не бывает), но это редкость, да и незачем


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

Секретный Санта - Время дарить подарки! Исправляем ошибки, рассказываем о работе внутри Тайный Санта, Новогодний обмен подарками, Обмен подарками, Длиннопост

Обитель администрато-модератора отличается в том, что физически она нигде не расположена - то есть из Интернета в нее не попасть.


Работает она на локальных компьютерах, с развернутым сервером (безопасность наше все)


Иногда мы активируем режим "Технические работы" - выглядит он для пользователей так:

Секретный Санта - Время дарить подарки! Исправляем ошибки, рассказываем о работе внутри Тайный Санта, Новогодний обмен подарками, Обмен подарками, Длиннопост

Эти самые работы нужны, чтобы добавить/поменять что нибудь в базе данных, а также проверить, что ничего нигде не выпадает


В заключение хотелось бы попросить причастных, и заинтересованных:


Сейчас полноценно заработала связь с Эльфами, так что смело тыкайте, тестируйте, попробуйте поломать находите косяки, орфографические ошибки и недочеты - будет усиленно править

Секретный Санта - Время дарить подарки! Исправляем ошибки, рассказываем о работе внутри Тайный Санта, Новогодний обмен подарками, Обмен подарками, Длиннопост

Далее расскажу вот о чем:


- До конца разворачиваем личный кабинет для всех браузеров, тестируем, снова ломаем

- Разбираемся с документами и правилами

- Показываем как платятся налоги


Всем добра :)

Показать полностью 8
Отличная работа, все прочитано!