Задать вопрос
  • Как сделать подтверждение действия с помощью biometrics (androidx.biometric:biometric:1.1.0)?

    @kaftanati
    Инженер-энтузиаст
    Так для инициализации и работы BiometricManager требуется ему передавать контект, полученый от активити - getActivity().getApplicationContext().

    Самое простое - вынести этот кусок кода в отдельную функцию, которой и передавать контекст через аргуумент.
    Ответ написан
    1 комментарий
  • Нужно ли использование скидок в Google Play?

    @kaftanati
    Инженер-энтузиаст
    Я так делал для платного приложения. Ноябрь 2017г.
    Ко мне обратился какой-то чувак, составляющий подборки супер скидочных приложений ля встроенного в Sony аппараты приложения.

    До акции - около 5к платных установок.
    На неделю цену в 0, размещалась в какой-то промо подборке для Sony устройств.
    110к бесплатных установок.
    Был расчет на то, что после возвращения цены, приложение будут чаще покупать, так как оно взлетит в топы.
    Ничего подобного. Изменение скачек после на уровне погрешности.
    Так-что рассматриваю это как бесплатный органический одномоментный трафик.
    Около 30к тех пользователей до сих пор пользуются приложением и возможно обратили внимание на мои остальные.

    Потом чувак писал еще, предлагал разместиться, я уже не повторял эксперимент.
    Ответ написан
    Комментировать
  • AlertDialog не разворачивается во всю ширину. Что делать?

    @kaftanati
    Инженер-энтузиаст
    Установить для ConstraintLayout

    android:layout_width="wrap_content"
    Ответ написан
    Комментировать
  • Индустриальная embedded система на базе Android-смартфона - как структурно правильно реализовывать?

    @kaftanati
    Инженер-энтузиаст
    Сталкивался со стендами, использующих Android устройства в качестве КВУ (контроллеров верхнего уровня).

    1. Стенд - большой железный ящик с кучей аппаратуры внутри.
    2. Снаружи закреплен обычный планшет с уходящим внутрь usb кабельком.
    3. Изнутри хаб с питанием. Питание постоянное от встроенного родного з/у, всегда воткнутого в сеть.
    4. К хабу подключены usb устройства, к которым обращается приложение для стенда (используется библиотека с гита).
    В т.ч. подключены устройства RS-485/RS-232.
    5. Для управления автоматикой используется отечественное программируемое реле ПР-200 (недорогое, простое, универсальное). Оно берет на себя в т.ч. защитные низкоуровневые задачи, обработку органов управления с панели стенда и т.д.
    6. Охлаждения дополнительного планшет не требует. Он снаружи - горячий, выключи, обдуй и т.д. Но так как он прикручен к железному корпусу (считай радиатор) - не проблема.
    7. В принципе можно использовать планшет полноценно - камера/передача данных и т.п. при наличии удобного подключения (гибкое и длинное).
    8. Стенды автономные, но вставленная симка, подключенный wi-fi - решают вопрос простой телеметрии и сбора статистики.
    9. Можно подключить принтер/ монитор/мышку/клавиатуру.

    Специализированные встраиваемые устройства:
    1. Или очень дороги (но встроенными интерфейсами RS485/232 и т.п.)
    2. Или дешевы и хрен работают (привет с али с устарелой осью и отсутствующей документацией)

    Готовые устройства потребительские:
    1. Или подороже покрасивше, но нежные. Все будет работать из коробки, в т.ч. OTG с питанием и т.п.
    2. Или подешевле обрезиненные с кривоватым ПО но с известными спецификациями и внятным описание на 4pda/xda. Но могут в силу дешевизны иметь кривоватую реализацию OTG (ограничения кол-ва устройств и т.п.).

    Если устройство снаружи - его легко заменить/обновить, вся периферия не трогается внутри стенда.
    Ответ написан
    4 комментария
  • Как сделать заливку в CorelDRAW 2017?

    @kaftanati
    Инженер-энтузиаст
    Возможно, что элемент, который вы пытаетесь залить - группа из нескольких - для работы с одним из них, следует группу "разгруппировать".
    Ответ написан
    Комментировать
  • Как сделать резервирование данных в андроид приложении?

    @kaftanati
    Инженер-энтузиаст
    Самый напрашивающийся ответ - Google Drive. Учетная запись Google есть у большинства Android пользователей, API публичен и вокруг куча примеров.
    И по аналогии - Dropbox.
    Оба решения бесплатные и для разработчика и для пользователя, при нескольких десятках тысяч ежедневных синхронизаций в своем проекте, о проблемах рапортуют до 10 человек в месяц, но проблемы обычно временные и, возможно, локальные.
    Ответ написан
    Комментировать
  • Как через EventBus передать значение конкретному фрагменту?

    @kaftanati
    Инженер-энтузиаст
    Можно в фрагменте сигнатуру инициализировать через конструктор фрагмента при создании.
    Ответ написан
    Комментировать
  • Как установить Eclipse с функцией создавать Android приложения?

    @kaftanati
    Инженер-энтузиаст
    Установить Android Studio, которая является официальной IDE для разработки под Android, выбранная гуглом, которая обновляется гораздо интенсивнее и фактически уже года три как вытеснила Eclipse с рабочих мест мобильных разработчиков.

    Современные гайды и обучалки под разработку также уже ориентируются на студию
    Ответ написан
    Комментировать
  • Как расширить рамки вложенного Framelayout?

    @kaftanati
    Инженер-энтузиаст
    1. Просмотреть отображаемую верстку - скорее всего отступы определены кем-то из родительских элементов.
    2. Если совсем запутанный экран - можно включить в настройках разработчика "Отображать ограничения макетов" и просмотреть на экране.

    Если уж совсем необходимо вылезти за пределы родительского представления - можно указать layoutMargin отрицательным "-8dp", но поосторожней с этим.
    Ответ написан
    Комментировать
  • Почему телефон активирует поиск без окей гугл?

    @kaftanati
    Инженер-энтузиаст
    Google приложение: Настройки: Голосовой поиск: Распознавание "Окей Google": На любом экране - Отключить

    b85e3d86e45b48af8d8593a367ebef3d.jpg
    Эта редиска еще и батарею ест, помимо того, что подслушивает все, что сказано и пытается распознать.
    Кстати, Google откликается и на "Отлей в угол" ))
    Ответ написан
    1 комментарий
  • Как правильно динамически менять Toolbar при работе с фрагментами?

    @kaftanati
    Инженер-энтузиаст
    В активити при инициализации:
    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
    if (toolbar != null){
        toolbar.setTitle(...);
        setSupportActionBar(toolbar);
        ...
    }

    В фрагменте при инициализации:
    Toolbar toolbar = (Toolbar) getActivity().findViewById(R.id.toolbar);
    if (toolbar != null)
       toolbar.setTitle(...);
       ...
    Ответ написан
  • Допустимо ли в новом приложении сразу же при запуске вешать рекламный баннер?

    @kaftanati
    Инженер-энтузиаст
    Если мне, как пользователю вначале покажут баннер, с вероятностью 99% я нажму назад для перехода в Google Play и снесу к чертям такое приложение с оставлением гневного отзыва.
    Вам самим бы было приятно?
    Ответ написан
    Комментировать
  • Какие практики популярны при создании Lite & Pro версии приложения?

    @kaftanati
    Инженер-энтузиаст
    Вот более развернутый пример для различных приложений (на выходе два APK, два приложения в маркете):

    android {
        compileSdkVersion 25
        buildToolsVersion "25.0.2"
    
        defaultConfig {
            minSdkVersion 16
            targetSdkVersion 25
            //vectorDrawables.useSupportLibrary = true
        }
    
        signingConfigs {
            debug {
                storeFile file('***\\debug.keystore')
                keyAlias 'androiddebugkey'
                keyPassword 'android'
                storePassword 'android'
            }
        }
    
        productFlavors {
    
            pro {
                applicationId = "com.example.pro" as ProductFlavor
                applicationId 'com.example.pro'
                buildConfigField "boolean", "pro", 'true'
    
                ***
    
            }
            lite {
                applicationId = "com.example.lite" as ProductFlavor
                applicationId 'com.example.lite'
                buildConfigField "boolean", "pro", 'false'
                
                ***
            }
        }
        buildTypes {
    
            debug {
    
                buildConfigField "boolean", "debugBuild", 'true'
    
                ***
            }
    
            release {
    
                buildConfigField "boolean", "debugBuild", 'false'
    
                ***
            }
    
        }
    }


    Но порекомендую все же использовать IAP разблокировку (встроенные покупки) и глобальный ключик pro, по которому вкл/откл рекламу и функционал.

    Во всяком случае - сразу используйте полноценные классы, никаких последующих сравнений/слияний. Плавали, знаем - извращение еще то.
    Ответ написан
    1 комментарий
  • Реально ли OTG + USB HUB + мышь + клава + зарядка + android?

    @kaftanati
    Инженер-энтузиаст
    Bluetooth HID - поддерживается в Android по умолчанию. USB порт для зарядки свободен, да и клавиатуру можно разместить удобнее, чем проводную относительно устройства.
    Ответ написан
    Комментировать
  • Как реализовать поиск в action bar через SearchManager с результатом на отдельной странице?

    @kaftanati
    Инженер-энтузиаст
    Рабочий пример:
    public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
            inflater.inflate(R.menu.fragment_expenses_menu, menu);
    
            // Associate searchable configuration with the SearchView
            SearchManager searchManager =  (SearchManager) getActivity().getSystemService(Context.SEARCH_SERVICE);
            SearchView searchView = (SearchView) menu.findItem(R.id.menu_search).getActionView();
            searchView.setSearchableInfo(searchManager.getSearchableInfo(getActivity().getComponentName()));
    
            searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
                @Override
                public boolean onQueryTextSubmit(String query) {
    
                    // String search_query for external using
                    AddData.EXP_SEARCH = query;
    
                    Intent intent = new Intent(getContext(), ActivityExpFromSearch.class);
                    intent.setAction(Intent.ACTION_SEARCH);
                    getContext().startActivity(intent);
                    return true;
                }
    
                @Override
                public boolean onQueryTextChange(String newText) {
                    return false;
                }
            });
            super.onCreateOptionsMenu(menu, inflater);
        }
    Ответ написан
    Комментировать
  • Как вы реализовывали прием пожертвований (donations) в своем приложении?

    @kaftanati
    Инженер-энтузиаст
    Основное средство приема платежей у меня Google Play. Но при этом на сайте проекта я подключил Yandex Деньги с пометкой, что это второстепенный способ оплаты для тех, кому неудобен/невозможен способ оплаты через GP (Крым/нет карточки или желания ее "светить"). Yandex Деньги принимает гораздо больше видов оплат:
    a02b728ec1be461d828c8c3b81addf9e.png
    Теоретически сумма доната может быть больше предустановленной - но если это не подчеркнуть, никто не заморочится.
    Ответ написан
    Комментировать
  • Navigation drawer как впихнуть раздел настройки?

    @kaftanati
    Инженер-энтузиаст
    Если:
    1. Используете стандартный DrawerNavigation от гугла (support библиотека)
    2. Используете для настроек обычное AppCompatActivity
    То просто по тапу на пункте меню запускайте Activity:
    if (id == R.id.nav_settings) 
      {
        startActivity(new Intent(this, ActivitySettings.class));
      }
    Ответ написан
    5 комментариев
  • Какие издержки заработка на приложении android?

    @kaftanati
    Инженер-энтузиаст
    Пример:
    Пользователь из Европы покупает ваше приложение за, скажем, 5 евро.
    В зависимости от его страны (а там везде разные правила) у вас сразу отберут 10-25% на налог в пользу этой страны.
    Тут же возьмет гугл свои 30% - причем 30% от первоначальной суммы, а не после уплаты налогов.
    На ваш счет в Google Merchant упадет 40-70% от изначально выплаченной суммы.
    В день перевода (15-18 число каждого месяца) ваши деньги из валюты Google Merchant ($) сконвертируются по банковскому курсу (-1..3р/$) и упадут вам на карту.

    В итоге, в среднем следует рассчитывать на 50-60% уплаченной пользователями суммы.

    Так как в России вот-вот введут налог, то текущий процент от российского покупателя (30%+20коп.) будет увеличен до средне-мировых.
    Ответ написан
  • Как убрать ошибку работы с бд?

    @kaftanati
    Инженер-энтузиаст
    Вы не инициализировали Helper. Вот мои методы:

    // открыть подключение
    public void open() {
        mDBHelper = new DBHelper(mCtx, DB_NAME, null, DB_VERSION);
        mDB = mDBHelper.getWritableDatabase();
    }
    
    public boolean isOpen() {
        return mDB.isOpen();
    }
    
    // закрыть подключение
    public void close() {
        if (mDBHelper != null)
            mDBHelper.close();
    }
    Ответ написан
  • Как провести статический и динамический анализ приложений Android?

    @kaftanati
    Инженер-энтузиаст
    1. Для начала средствами IDE Android Studio: Menu-Analyze-Inspect code
    2. Можно установить различные плагины, расширяющие функционал анализатора. Под тот же Elipse был популярен FireBug
    3. Динамически можно:
    - поснимать дампы памяти и процессов через Android Monitors-Monitors-Start method tracing, но это очень приблизительно
    - встроенной утилитой tracert IDE Android Studio: Tool-Android-Android Device Monitor

    Но самый действенный метод для динамического анализа - установить приложение на самый древний смартфон, который оно поддерживает с минимальными параметрами памяти/разрешения - тут же вылезут все проблемы производительности и отсутствия оптимизации.
    Ответ написан
    Комментировать