• Как сделать нормальную однократную перезагрузку активити без зацикливания программы при смене локали android?

    akaish
    @akaish
    Стек Java\Android
    Вы в onStart() запускаете метод changeLang(strLocal), который независимо от того, является ли нужная локаль запрошенной, перезапускает активити. У Вас бесконечный цикл.
    Добавьте в changeLang(String) if ветвление с проверкой на текущую локалью, если она соответствует запрашиваемой - просто выходите из метода.
    Ответ написан
    Комментировать
  • Правильно скрывать панели или переходить на новый экран?

    akaish
    @akaish
    Стек Java\Android
    В Вашем случае нет "правильного" решения. Я бы посоветовал использовать фрагменты вместо перехода на новый активити или скрытия\отображения сета элементов View. Фрагменты просто удобнее.
    Ответ написан
    Комментировать
  • Если ли пример не убиваемого сервиса который будет работать постоянно, в фоне, пока не выключишь на всех версиях андроид?

    akaish
    @akaish
    Стек Java\Android
    В Android нет гарантии, что сервис не будет завершен операционной системой по тем или иным причинам. Но никто не мешает Вам перезапускать сервис в случае его остановки. Делается это следующим образом: Вы можете зарегистрировать помимо сервиса BroadcastReceiver, который будет перезапускать Ваш сервис при его выключении. В теле метода onDestroy() вашего сервиса отправляй Ваш Broadcast, это Broadcast сообщение будет получено Broadcast ресивером, при получении оного который уже будет повторно запускать Ваш сервис.

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

    Третий способ - используйте sticky сервис. При старте сервиса с START_STICKY ОС должна его перезапускать при остановке.
    Ответ написан
  • Правильно ли я выбрал язык?

    akaish
    @akaish
    Стек Java\Android
    В целом верный выбор. Есть еще альтернативы: .NET и Objective-C. И еще миллион альтернатив. Язык - это инструмент, не более. Java подходит под Ваш круг интересов. Также, как и .Net и Objective-C. И еще миллион альтернатив. Но, как и у любого "мультитула", у Java есть недостаток: многие вещи из вашего круга интересов часто проще реализовывать более узконаправленным инструментарием.

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

    В общем, ответ сумбурный, в общих чертах выбор правильный, но имеет равноправные альтернативы.

    Кстати, подобное у меня спрашивал мой знакомый, тоже 1C-шник. w3bstr?
    Ответ написан
    4 комментария
  • Можно ли завести windows 7 на ryzen 2200g или ryzen 2400g?

    akaish
    @akaish
    Стек Java\Android
    Нет ни единой причины, почему под хостом Win10 в virtualbox не заведется Win7. Вообще ни одной.
    Ответ написан
    2 комментария
  • Парсинг html в андроид. Есть примеры?

    akaish
    @akaish
    Стек Java\Android
    Для схожей задачи я в свое время использовал HtmlUnit. Но это по факту полноценный веб браузер. Возможно, в Вашем случае это будет "из пушки по воробьям". Тем не менее, нужный Вам функционал в этой библиотеке присутствует: см. Finding a specific element

    UPD. Если html сайт ваш - не ленитесь написать скрипты, отдающие информацию для приложения в чем-то более подходящем, чем HTML. HTML - язык разметки. Встаньте на светлую сторону, используйте JSON, CSV, или, на худой конец, XML. Используя HTML для данных целей Вы заставляете использовать больше ресурсов для обработки Ваших данных и приближаете тепловую смерть вселенной. А если без шуток - зачем заставлять тянуть человека через мобильный интернет данные, которые не пригодятся? Только трафик жрать. Да и подумайте о людях, которые могут использовать приложение в местах, далеких от стабильного покрытия даже 3G.
    Ответ написан
    Комментировать
  • Насколько безопасен Android 6.0.1?

    akaish
    @akaish
    Стек Java\Android
    Пользуйтесь спокойно. Если сторонних приложений нет, а разрешения настроенные, шанс потерять денежные средства с карточки минимальный. Это уже из разряда паранойи. Если всё-равно нервничаете - пользуйтесь самой свежей версией стороннего браузера (к примеру, Mozilla), отключите JS для всех веб сайтов кроме доверенных и поставьте антивирус + файрвол.
    Если желаете - поищите новые прошивки на нужное устройство. Если совсем параноите и новых прошивок больше нет - шейте кастом ром на основе образа из Android SDK
    А так, повторюсь, практического смысла в этом нет. Уязвимости есть всегда. Только обычных людей никто ломать спецом не будет. А даже, если этот конкретный планшет будет взломан, двухфакторная аутентификация не позволит злоумышленнику воспользоваться Вашими средствами.

    Лучше задумайтесь об использовании мобильного телефона (мобильный банк, передача конфиденциальной информации посредством телефонной связи). Алгоритм A5 (используется до сих пор в стандарте GSM) ломается после 8 секунд разговора, а подмена базовой соты делается проще простого. А если Вы перезагрузите телефон из-под подмененной базовой соты, злоумышленник без проблем получит Ваш iccid и imsi и сможет эмулировать вашу симкарту со всеми вытекающими. И Вы этого даже не поймете. Во дворе припаркован фургончик, а телефон даже и не поймет, что подключен к левой базовой станции. А кто-то уже обчищает вашу карточку переводами через смс банк.
    Ответ написан
    Комментировать
  • Как правильно организовать загрузку файлов из какого-то источника в Android?

    akaish
    @akaish
    Стек Java\Android
    Интересный вопрос. Интересен он не уникальной задачей или же сложной задачей, а тем, что вариантов реализации поставленной задачи огромное количество.

    Давайте накидаю Вам сходу некоторое количество равноправных решений.

    1) Скачивание нужных файлов по любому протоколу (HTTP\FTP\SFTP), который Вам больше подходит. Если также необходим хостинг - выбираете любого хостера по вашему вкусу. Буквально. Можно даже обойтись сверх дешевыми статичными хостингами. Из минусов - самостоятельная настройка сервера, хуже аптайм, чем в следующем варианте.

    2) Используете уже готовые связки API + хостер. Firebase, dropbox etc. Опять же, что угодно. К примеру, Dropbox: https://www.dropbox.com/developers-v1/core/start/a... Из минусов - почти идеальное решение, но нет кое-каких очень приятных возможностей. Также, стоит денег.

    3) Используете систему контроля версий. К примеру, GIT. Из плюсов - меньше трафика при обновлении вашего сета данных, 100% распределенная система, до какой-то степени "бесплатность" (при условии Open-Source лицензии на сет данных и того, что объем трафика не будет превышать бесплатные лимиты). Из минусов - сложнее реализовывать на стороне клиента.

    4) Используйте p2p. Самая сложная в реализации опция, нет функционала контроля версий. Зато самые низкие затраты на оплату траффика.

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

    UPD. Лично я бы сделал либо на GIT, либо на Dropbox. API готовы, хостинги хорошие. Dropbox - один из самых простых вариантов, GIT - требует знания NDK (чуть сложнее в имплементации), зато дает просто идеальный функционал для редактирования и обновления сета данных.
    Ответ написан
    Комментировать
  • Как реализовать скачивание картинки на телефон в Android Studio?

    akaish
    @akaish
    Стек Java\Android
    Причем тут Android Studio?
    Делается это следующим образом: получаете контекст приложения, по id ресурса получаете InputStream, из полученного InputStream копируете байты в OutputStream свежесозданного файла, куда хотите сохранить картинку.
    Ну и не забывайте указать в манифесте приложения разрешение на доступ к файлам на SD карте и внутренней памяти устройства. Перед процессом копирования запрашиваете у пользователя доступ вашего приложения к данному разрешению.
    Или Вам готовый сниппет нужен?
    Ответ написан
    1 комментарий
  • Как сохранять авторизацию в приложении?

    akaish
    @akaish
    Стек Java\Android
    А причем тут токен в приложении? Вам надо сохранять сессию пользователя между серверами, вот и всё.

    Как хранить токен на устройстве клиента - зависит от платформы. Для андроид - internal storage и флаг MOD_PRIVATE на файл токена, к примеру.

    UPD. Вопрос то не совсем корректен. Сессия пользователя должна сохраняться между серверами. Как вариант - сервер авторизации, чтобы не мучиться с сертификатами. Конкретнее по стеку технологий можно инфу? Может, даже подскажу конкретное решение.

    UPD.2 Продублировал из комментария, так как комментарии по умолчанию скрыты.
    Итак, в кратце, без заумных слов, рецепт на скорую руку:
    1) в php пишем свой session handler, сохраняющий сессии в БД (!) находящуюся на отдельном сервере, который имеет хороший аптайм (ну или по уму, отказоустойчивый кластер)
    2) при авторизации на сервере используется наша модная имплементация session handler, 16 битный ключ сессии при удачном логине сохраняется в бд, этот же ключ по HTTPS отдается клиентскому приложению и на нем сохраняется
    3) при отключении сервера пользователь перенаправляется на новый сервер, который использует ту же самую реализацию session handler, по https передается 16битный ключ сессии, проверяется по БД. Сессия загружается из БД.

    Всё. Это черновой "и так сойдет" вариант. Сам ключ сессии хранится на устройстве в приватных файлах приложения.

    По уму же использовать готовые решения а-ля https://openid.net/
    Ответ написан
  • Кнопки не реагируют на вызов. В чем может быть ошибка?

    akaish
    @akaish
    Стек Java\Android
    Код дайте по нормальному. В андроиде помимо RecyclerView и RecyclerViewAdapter есть еще и ListView, который также в паре с адаптером используется.

    Дальше, может я чего-то не понимаю (до сих пор по привычке и в целях совместимости на ListView списки делаю, RecyclerView не трогал по нормальному, так как задач с большими списками не было), но каким макаром вешается onItemClickListener() на адаптер? Или у вас собственная реализация адаптера, через метод которого Вы назначаете на целевой RecyclerView анонимную реализацию класса ListItemClickListener, унаследованную от RecyclerTouchListener????

    Я не поленился, и нагуглил ListItemClickListener в блоге какого-то глубокоуважаемого индуса: ListItemClickListener
    Вы оттуда копипастили? А откуда Вы скопипастили тогда "гениальное" решение назначать обработку событий не на View, а на адаптер? Это же в корне противоречит MVC архитектуре dataset-adapter-view. И ладно, что в блоге с примером ListItemClickListener используется просто дурацкая схема именования класса, которая сбивает с толку. Тут то архитектурная ошибка на уровне шаблонов проектирования.

    Резюмируя, предоставленного кода недостаточно, на лицо ошибки проектирования и совершенно дурацкое наименование классов потомков. Также, я не понимаю, зачем наследоваться от регулярного потомка абстрактного RecyclerView.OnItemTouchListener в анонимном то классе. Что это вообще за дичь?

    Искать ошибки не имеет смысла. Недостаточно предоставленного кода и дичь какая-то с конкретной реализацией адаптера и RecyclerView.OnItemTouchListener. Вот туториал, я его прочитал, по нему можно сделать правильно: https://www.androidhive.info/2016/01/android-worki...

    По текущему коду, связанному с RecyclerView - можно оставить только лэйауты. И всё. Остальное переписать. В этом коде я вижу малоосмысленного Франкенштейна из копипасты. Надеюсь, Вы только учитесь. Если это коммерческий проект какой-то фирмы, дайте, пожалуйста, в личку, её название. Буду обходить её продукты стороной, просто если это планируется в качестве реального кода, с таким "х@@к, х@@к и в продакшен" продуктом иметь дел не хочется, как, впрочем, и работать с такими людьми.

    UPD.1 Еще раз пробежался по коду глазами. Что это за дичь?
    private void loadData() {
            showLoader();
            loadJson();
    }

    И
    hideLoader();
    adapter.notifyDataSetChanged();

    метода parseJson(String jsonData)??? Как бы продолжительные операции делаются вне GUI потока, иначе можно ANR получить. Реализуется через AssyncTask (простой способ).

    UPD.2
    @Override
        public void onBackPressed() {
            if (drawer != null && drawer.isDrawerOpen()) {
                drawer.closeDrawer();
            } else {
                AppUtilities.tapPromtToExit(this);
            }
        }

    Вот не надо тащить из дикого веба диалоги "А Вы точно хотите выйти?". На андроиде подтверждение выхода из приложения принято делать двойным тапом на back кнопку с Toast после первого тапа. Диалог следует вешать только в тех случаях, когда при случайном выходите возможна потеря пользовательских данных (к примеру, набора текста). И то, если правильно подходить к разработке Android приложений, таких ситуаций возникать не должно в принципе. В догонку: Understand the Activity Lifecycle

    UPD.3 Ну и хоть бы код форматировали. В Android Studio хоткей по умолчанию CTRL-SHIFT-ALT-L.
    Ответ написан
    Комментировать
  • Как изменить цвет нижней панели навигации?

    akaish
    @akaish
    Стек Java\Android
    Эта панель называется navigation bar. Из активити вызываете следующий метод с нужным Вам цветом:
    getWindow().setNavigationBarColor(getResources().getColor(R.color.colorAccentPurple));

    Или, если хотите, через стили:
    <item name="android:navigationBarColor">@color/colorAccentPurple</item>

    Больше информации тут: доки
    Ответ написан
  • Как изучить язык баз данных SQL?

    akaish
    @akaish
    Стек Java\Android
    К сожалению, чтобы Вам что-то посоветовать - необходимо узнать Ваш личный "фундамент". Хоть указанная Вами книга и будет полезной (даже с учетом того, что она писалась для MySQL версии 4.х, фундаментально как в СУБД, так и в SQL и в конкретном синтаксисе MySQL последнее, наверно, десятилетие, ничего не менялось), я бы посоветовал следующий алгоритм обучения:

    1) Знакомство с основами реляционной алгебры, нормальными формами и реляционной моделью. Без фанатизма, прочтение и осознание статей даже на Википедии хватит за глаза.

    2) Знакомство с спецификацией SQL2008. Опять же, без фанатизма. В любом случае, работать Вы будете впоследствии с определенным диалектом языка.

    3) Выбор диалекта языка. Подбор литературы (практически любой, за исключением книг из серии "{0} для чайников" и "100 и одно решение для {0}"). На этом этапе важно определиться также с инструментарием, который Вы будете использовать в дальнейшем. Для начала подойдет любой онлайн интерпретатор SQL кода, к примеру sqlfiddle. Но по мере изучения Вам понадобятся более сложные инструменты.

    4) Знакомство с UML. Точнее, если по минимуму, с той частью, которая затрагивает прототипирование БД. SQL и СУБД - это инструменты, которые позволяют автоматизировать процессы бизнес логики. UML позволяет эти процессы описать и на основе этих процессов создать прототип схемы БД, от которого уже можно идти к конкретной реализации.

    Итак. Четыре базовых шага выполнены. Дальше все просто, перевариваете информацию и занимаетесь практикой от простого к сложному (в комментариях уже указывали вполне годные наборы задачек). Попутно узнаете особенности программной реализации выбранной Вами СУБД. И внимательно читаете документацию от разработчика. На примере SQLite, у них подробно разобрана семантика запросов: SQLite CREATE. Под MySQL найдете сами.

    Теперь поясню, почему все четыре шага важны.
    1) Без базовых фундаментальных знаний вы просто не поймете, почему, к примеру, в ячейке столбца номера нельзя указывать два номера телефона, или как работают ограничения на целостность данных.
    2) Хоть диалекты SQL и отличаются от стандарта SQL:2008, следует понимать, что знание стандарта позволит Вам в случае необходимости переключиться с одной СУБД на другую. Также, хорошая реляционная SQL СУБД должна быть совместима с этим стандартом априори.
    3) Тут на Ваш вкус. Посмотрите изложение автора перед покупкой, посмотрите списки того или иного программного обеспечения. Но факт остается фактом, что прочтение только стандартов, мануалов и официальной документации - путь явно не для всех. Кому-то просто необходимо "художественное" изложение, да и просто из книг можно почерпнуть реальные примеры из опыта автора.
    4) Надо понимать, что реляционные СУБД всего лишь инструмент для хранения и обработки данных, обеспечивающий определенные бизнес-процессы определенной предметной области. И под бизнес-процессами следует понимать не как какую-то эфемерную для простого человека вещь, а то, что закладывается под этим словом в оригинальном языке, т.е. совокупность процессов\действий, направленных на создание продукта\предоставление услуги. А средства UML позволяют все это описать в стандартизированной графической форме. Чтобы знать SQL не надо знать UML, не надо знать, что такое и, к примеру, ЖЦ программного продукта. Но со временем, если Вы захотите расти дальше, Вам нужен будет инструмент прототипирования. Также, как если вы дорастете до архитектора БД, вам нужно будет представление о том, как эти БД проектировать, начиная с описания предметной области и заканчивая организационной точкой зрения. Стандарты ГОСТ 34.601-90 и ISO/IEC 12207:2008.

    Я, как и многие, начинал с какого-то полу прочитанного учебника и примеров из сети. Сейчас я понимаю, что просто потратил время практически впустую. Как ни странно, хоть и принято ругать наше образование, но список курсов для специальностей "ПИ" подобран не просто так. Помимо самого языка следует знать математический "бэкенд" и как его использовать для реализации задач предметной области. Я отношусь к SQL потребительски, это не мой основной язык, но сейчас я понимаю, что если бы уделил ему больше внимания не как языку, а, в первую очередь, как к одному из инструментов СУБД, работающих на основе реляционной алгебры для обеспечения бизнес-процессов, я бы избежал кучу потерянного времени, костылей и ошибок. Надеюсь, мой ответ будет Вам полезен.
    Ответ написан
    3 комментария