Ответы пользователя по тегу Android
  • Куда исчезает фрагмент?

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

    Рискну предположить, что FragmentManager, который возвращает null, уже не является экземпляром, который существовал при запуске диалога. Происходит это, например, в результате смены ориентации устройства.
    Ответ написан
    Комментировать
  • Как сделать notification в определенное время?

    1.1. Можно даже в SharedPreferences хранить. tinyw.in/Gxjx
    1.2. https://ru.wikipedia.org/wiki/%D0%A3%D1%80%D0%B0%D... - кратко и ясно.

    2.1. tinyw.in/Gxjx
    2.2. Используйте WorkManager. https://bit.ly/31tKRLl
    Ответ написан
    Комментировать
  • Как очистить статус операции WorkManager после прочтения в android?

    Попробуйте добавить вызов keepResultsForAtLeast с длительностью 1 миллисекунду в OneTimeWorkRequestBuilder.
    Ответ написан
    Комментировать
  • Неужели порог вхождения в андроид разработку настолько высокий?

    Программирую на всяком-разном 30 с лишним лет, пишу под Андроид с самого его начала - начал незадолго до того, как приобрёл HTC A3288 Tattoo, почти 10 лет уже как.

    Не имею опыта работы, но понимаю как работает: Dagger, RxJava2, Moxy, разнообразное юнит-тестирование и всякие либы поменьше. Ничего не помню наизусть, даже методы класса Object. Имею смутное представление о том, как работает многопоточность, какие там есть виды списков и в душе не понимаю, как устроено хэширование объектов. Без IDE с подсказками и онлайновой помощи глух и слеп как котёнок.

    Без работы не сижу. Считаю себя успешным.

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

    * В первую очередь, необходимо иметь и культивировать четыре вещи: здравый смысл, уверенность в себе, внутреннюю свободу и аккуратность. Даже если вы ничего не знаете сейчас, вы должны осознавать, что узнаете это всё потом. И то, лишь в случае, если считаете необходимым. А благодаря аккуратности вы будете понятны большему числу коллег.

    * Поскольку библиотек с дублирующейся направленностью пруд пруди, важнее знать принцип работы, а не какую-то конкретную библиотеку.

    * Вы должны понимать, что все эти Dagger, RxJava и прочие Moxy - тупо библиотеки тупо пацанов, которые сидят в трусах перед компами и всё такое. То есть, изначально это всё - нонконформистская прогрессивная адова самописуха с присущими ей концептуальными и арфогрофичесскими ошибками, которая в нечастых случаях превращается в продукт примерно корпоративного масштаба. Потому, надо стараться не переоценивать их значимость на вегетативном уровне.

    * Держитесь корней. То есть, за корни. Ну, в общем, за JetPack, AndroidX и всё, что выдумал Google. Это основное и самое важное.

    * Старайтесь обходиться минимумом зависимостей.

    * Кроссплатформа - это совсем другая индустрия. Надо определиться, нативщик вы или кроссплатформа.

    * Обычное трудоустройство напоминает обучение вождению в автошколе: вы учите кучу всего, что требуется, потом сдаёте экзамен, получаете водительское удостоверение и через год помните только правило правой руки и полдюжины дорожных знаков. Ездите по городу по привычке, страдаете от того, что где-то повесили новый или убрали старый знак.

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

    * Иногда важнее знать русский язык, нежели Java или Kotlin. Впрочем, иногда технический английский ещё важнее.

    * Даже если днище, безнадёга и фриланс, надо понимать, что есть два типа клиентов: те, которым надо красивый код в стартап и те, которым код не надо.
    Ответ написан
    2 комментария
  • Как оставлять приложение всегда активным в Android?

    Нужно отключать фунцию энергосбережения.
    Ответ написан
    Комментировать
  • Как выполнять код с определенной периодичностью?

    AndroidManifest.xml
    ...
    <receiver android:name=".MyAlarmReceiver" />
    <service android:name=".MyService" android:process=":my_app_alternate" android:enabled="true" />
    ...


    MyAlarmReceiver.java
    public class MyAlarmReceiver extends BroadcastReceiver {
    
        @Override
        public void onReceive(Context context, Intent intent) {
            context.startService(new Intent(context, MyService.class));		
            setupAlarm(context);
        }
    
        final long intervalMs = 60000; // Интервал в миллисекундах
    
        public static final void setupAlarm(Context context) {
            AlarmManager am = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
            Intent i = new Intent(context, MyAlarmReceiver.class);
            PendingIntent pi = PendingIntent.getBroadcast(context, 0, i, 0);
            if (am != null) {
                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
                    am.setAndAllowWhileIdle(AlarmManager.RTC_WAKEUP, System.currentTimeMillis() + intervalMs, pi);
                } else {
                    am.set(AlarmManager.RTC_WAKEUP, System.currentTimeMillis() + intervalMs, pi);
                }
            }
        }
    }


    MyService.java
    public class MyService extends Service {
    
        Thread workThread = null;
    
        @Override
        public IBinder onBind(Intent intent) {
            return null;
        }
    
        @Override
        public int onStartCommand(Intent intent, int flags, int startId) {
            if (workThread == null) {
                workThread = new Thread(run);
                workThread.start();
            }
            return Service.START_STICKY;
        }
    
        final Runnable run = new Runnable() {
            @Override
            public void run() {
                try {
                    while (true) {
                        //todo Что там надо делать раз в секунду
                        Thread.sleep(1000);
                    }
                } catch (InterruptedException iex) { }
    			
                workThread = null;
            }
        }
    }


    Когда необходимо запустить выполнение кода, вызываем MyAlarmReceiver.setupAlarm. Последующие вызовы происходят из MyAlarmReceiver.onReceive.
    Ответ написан
    7 комментариев
  • Как правильно использовать расчет расстояний Distance Matrix API?

    Я рискну предположить, ваша проблема в "дребезге" показаний GPS, отличающихся на несколько метров. Стоите вы в пробке 10 минут, например, а по показаниям GPS совершаете 5- 10-метровые "прыжки" около одной точки.

    Присмотритесь к данным. Если всё так, как я говорю, прикрутите фильтрацию, которая будет адаптировать полученные данные к скорости вашего перемещения.

    Начните с отсеивания данных, если расстояние между ними, поделенное на количество секунд, будет менее N метров (быстрее чем пешеход).

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

    Да много всяких ухищрений можно придумать. Всё зависит от вашей ситуации.
    Ответ написан
    Комментировать
  • Как сделать переход между страницами в Android Studio?

    Вы хотите сделать переход:
    1) Между страницами одного WebView
    2) Из Activity в Activity
    3) Переключить Fragment в Activity

    Выберите нужное.

    (UPD 07.01.2019)
    Прекрасная инструкция по навигации для начинающих программировать для Android: developer.alexanderklimov.ru/android/activity.php
    Ответ написан
    Комментировать
  • Как сделать трансляцию экрана с андроида на линукс?

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

    Цена не такая уж высокая, всего 40 долларов "навсегда", 2.5 баксов в месяц, либо 10 в год. В бесплатной версии раз в несколько минут показывают рекламу, но это неточно, потому что чаще всего показывают один раз и больше не показывают.

    В общем, рекомендую.
    Ответ написан
    Комментировать
  • Какие знания нужны, чтобы создать такой продукт под android?

    Вот примерный список зависимостей, покрывающий описанные вами нужды:

    implementation "com.google.firebase:firebase-core:16.0.1"
    implementation "com.google.firebase:firebase-auth:16.0.2"
    implementation 'com.firebaseui:firebase-ui-auth:4.0.0'
    implementation "com.android.support:appcompat-v7:${supportLibVer}"
    implementation "com.android.support:support-v13:${supportLibVer}"
    implementation "com.android.support:recyclerview-v7:${supportLibVer}"
    implementation "com.android.support:design:${supportLibVer}"
    implementation 'com.android.support:multidex:1.0.3'
    implementation "com.google.android.gms:play-services-maps:${gmsVersion}"
    implementation "com.google.android.gms:play-services-location:${gmsVersion}"
    implementation "android.arch.lifecycle:extensions:${aacVer2}"
    kapt "android.arch.lifecycle:compiler:${aacVer}"
    implementation "android.arch.persistence.room:runtime:${aacVer2}"
    kapt "android.arch.persistence.room:compiler:${aacVer}"
    implementation "com.squareup.retrofit2:retrofit:${retrofitVer}"
    implementation "com.squareup.retrofit2:converter-gson:${retrofitVer}"
    implementation "com.squareup.okhttp3:okhttp:${okHttpVer}"
    implementation "com.squareup.okhttp3:logging-interceptor:${okHttpVer}"
    implementation 'com.karumi:dexter:4.2.0'
    implementation 'com.google.code.gson:gson:2.8.4'
    implementation 'de.hdodenhof:circleimageview:2.2.0'
    implementation 'ch.acra:acra-http:5.1.2'
    implementation('com.afollestad.material-dialogs:core:0.9.6.0') {
        exclude group: 'com.android.support', module: 'appcompat-v13'
    }
    implementation ('com.squareup.picasso:picasso:2.71828') {
        exclude group: 'com.android.support', module: 'animated-vector-drawable'
        exclude group: 'com.android.support', module: 'exifinterface'
    }


    Но, на данном этапе, он, скорее всего, будет для вас бесполезен. :) Начинать надо с другого края.

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

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

    Далее вы должны по поводу и без повода обращаться к руководствам Google по разработке для Android. Если вы Android-разработчик - вам без них никуда. Вникайте в методологии и методики, предлагаемые разработчиком платформы. Это очень важно, поскольку 90% возможностей приложения нормального человека так или иначе завязаны на сервисы Google.

    Затем следуют отраслевые ресурсы. Сайты с библиотеками кода и средствами разработки, через которые обменивается знанием подавляющее большинство разработчиков - ещё один ключ к успеху. В наше время лучше всего не изобретать колесо, если вы не заявляете себя в качестве изобретателя и конструктора колёс. Старайтесь в первую очередь использовать наработки людей, которые уже потратили своё время на решение конкретной задачи. Множество драгоценных камней сверкает в таких местах как https://android-arsenal.com/ , например.

    И пара советов лично от меня:
    • Изучайте Kotlin.
    • Приобретите 16 gb памяти, SSD и процессор с четырьмя или более ядрами. Установите и освойте Linux, хотя бы в объёме, необходимом для разработки приложений. Впрочем, я уверен, когда привыкнете, он вам понравится сам по себе. Я рекомендую Linux Mint.
    Ответ написан
    Комментировать
  • Почему на версиях Android выше 6.0 не работает BroadcastReceiver onReceive?

    Причин может быть несколько.

    Во-первых, убедитесь, что всё именно так, как вы думаете. Попробуйте запускать Activity вместо Toast.

    Во-вторых, добавьте в receiver это:

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

    а в манифест это:

    <uses-permission android:name="android.permission.QUICKBOOT_POWERON" />

    и проверьте, чтобы было так:

    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
        android:installLocation="internalOnly"
        ... >

    Приложение должно быть запущено хотя бы один раз. Для этого добавьте в проект хотя бы одну Activity.

    И можно проверить настройки безопасности системы или сторонних приложений, обеспечивающих безопасность.
    Ответ написан
    Комментировать
  • Использовать Fragment?

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

    В данном случае необязательно использовать фрагмент. Но если вы пожелаете видеть "область 2" в другой части своего приложения, использование фрагментов для реализации "области 2" будет обоснованным шагом.

    Основной минус фрагментов в том, что это независимые части приложения, которые не обязаны знать, что происходит в других местах приложения. А обмен информацией между компонентами в Android - довольно сложная, отдельная от данного вопроса тема.
    Ответ написан
  • Можно ли в Android приложении получить имя apk-файла, из которого оно было установлено?

    PackageManager pm = getPackageManager();
    try {
        ApplicationInfo ai = pInfo.getApplicationInfo("package вашего приложения", 0);
        String sourceApk = ai.publicSourceDir;
    } catch (NameNotFoundException e) {
        e.printStackTrace();
    }
    Ответ написан
    Комментировать
  • Как сделать авторизацию в приложении через Google+?

    Вызов, возвращающий сведения о пользователе:

    https://www.googleapis.com/oauth2/v3/tokeninfo?id_token=(ваш_токен)


    Должен вернуться HTTP 200 OK и JSON со списком полей.
    {
      "aud": GOOGLE_CLIENT_ID,
      "sub": GOOGLE_USER_ID,
      ... Ещё какие-то поля ..
    }

    Проверяем, соответствует ли aud нашему GOOGLE_CLIENT_ID и если да, пользуемся значением sub для идентификации пользователя.

    GOOGLE_CLIENT_ID - это идентификатор, завершающийся на ".apps.googleusercontent.com", который можно получить в консоли Google API (создать Web Application)
    Ответ написан
    Комментировать
  • Как сохранить данные ArrayList в Adndroid при повороте экрана?

    Возможно, будет проще использовать статический список, инициализировав его один раз:

    staic ArrayList<MyItem> alm = null;
    
    @Override
    public void onCreate(Bundle sis) {
    ...
    if (alm == null) {
      alm = new ArrayList<>();
      // Заполняем список
    }
    // Создаём ArrayAdapter с параметром alm, отдаём его ListView-у и т.д.
    ...
    }


    А если несколько однотипных фрагментов/активитей, можно вообще использовать статический список списков:

    static HashMap<String, ArrayList<MyItem>>
    Ответ написан
    Комментировать
  • Как изменить разрешение экрана на Android 2.3?

    Вы извините, может глупый вопрос, но всё же…

    Там нет функции калибровки тача?
    Ответ написан