Ответы пользователя по тегу Android
  • Почему не засчитываются скачивания?

    AlexMarken
    @AlexMarken
    Во-первых, Гугл обновляет статистику с некой периодичностью. К примеру, раз в 2-4 дня.
    Задержка статистики есть, как на странице приложения в магазине, так и в консоле разработчика.

    Во-вторых, отображение количества загрузок в магазине (не в консоле) всегда выводится в определённом диапазоне.
    >1 (1 - 5 загрузок)
    >5 (6 - 10)
    >10 (11 - 50)
    >50 (51 - 100)
    >100 (101 - 500)
    >500 (501 - 1000)

    И тп.

    В-третьих, как на 4PDA выкладывали? Ссылкой на Play Store или apk заливали?
    Заливали на форум apk - в этом случае никакие скачивания в Google учитываться не будут.
    Оставляли ссылку на страницу в магазине - перейти по ссылке в магазин люди, может и перешли, но скачивать не стали. В этом случае, 4PDA отображает статистику переходов в магазин, но никак не скачиваний.
    Ответ написан
  • Зачем нужны нативные языки для мобильной разработки?

    AlexMarken
    @AlexMarken
    На нативных языках приложение будет работать быстрее, занимать меньше памяти, как оперативной, так и физической относительно такого же функционала, но на другом языке. Использование самого свежего функционала ОС. Да и в каком-то плане, наиболее безопаснее. Всё это благодаря низкоуровневому обращению к API и инструкциям системы.

    React Native и другие подобные средства лишь упрощают разработку, сокращая необходимое время и деньги на эту процедуру. Согласитесь, для заказчика дешевле будет написать один код (но с различными исключения под платформы) для iOS и Android, чем нанимать разработчиков под каждую платформу. Такие приложения имеют ограничения по разному функционалу, что приводит к написанию ещё большего кода.

    Вот пример.
    Много лет назад из любопытства написал два одинаковых по функционалу приложения под Android на Java и Delphi (да, он тоже теперь кроссплатформенный). На Java приложение работало намного быстрее - раза в 1.3-1.5 и занимало в 4 раза меньше физической памяти.
    И ещё один, но про Рокетбанк.
    Рокетбанк выпустили новое приложение на RN для iOS и Android. Возьмём платформу iOS.
    1. Функционал нового и старого приложений одинаков, но страница авторизации с подтверждением входа по TouchID в новой версии висит куда дольше - на пару секунд. Не думаю, что там такой огромный функционал, который увеличивает время инициализации приложения.
    2. Занимает в 2 раза больше физической памяти.
    3. Накатывали JailBreak на прошивку... доступ к данным старого приложения получить не удалось, из нового вытащили различную инфу, включая токен сессии.

    И гугл в помощь.
    Ответ написан
  • Стоит ли продолжать учить android Разработку в 2018?

    AlexMarken
    @AlexMarken
    Во-первых, прочтите эту новость.

    Цитата из статьи:
    В Google подчеркнули, что Kotlin будет дополнительным языком и ни в коем случае не заменит Java и C++ (на сегодняшний день языком первого класса для Android является именно Java). Планируется, что инструменты Kotlin, основанные на JetBrains IDE, будут по стандарту включены в Android Studio 3.0 — официальный инструмент разработки для ОС Android.
    Подробнее: www.cnews.ru/news/top/2017-05-18_google_perevodit_...


    Во-вторых, Java останется с Android навсегда - как минимум из-за Java Machine, которую использует ОС.
    В-третьих, Google не смысла заменять Android другой операционкой. Это будет крайне сложно и затратно сделать. Если Google разрабатывает новую ОС, то лишь для определённых устройств.

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

    AlexMarken
    @AlexMarken
    Просто по ссылке нельзя. Можно сделать через промокоды.
    На каждого пользователя генерируется код (например, шестизначный), который предназначен для ввода другим юзером в приложении. Соответственно, в приложении желательно сделать функцию отправки промокода через соц сети или по смс.
    Ответ написан
  • Как отправить СМС в Android API без появления диалога?

    AlexMarken
    @AlexMarken
    Вне зависимости от того, смените вы или нет приложение по умолчанию, диалог на доступ к системной функции всё равно будет.

    Особенности разрешений можете почитать здесь.

    Попробуй дать сделать приложение "Администратором устройства".
    Давно делал систему контроля корпоративных устройств с возможностью удалённо через наш web-интерфейс сбрасывать пароли и полностью очищать данные. Решением была такая возможность.

    В AndroidManifest:
    <uses-feature
            android:name="android.software.device_admin"
            android:required="true"/>
    
        <application
           .........
            <receiver
                android:name=".Receiver.AdminReceiver"
                android:permission="android.permission.BIND_DEVICE_ADMIN">
                <meta-data
                    android:name="android.app.device_admin"
                    android:resource="@xml/device_admin"/>
    
                <intent-filter>
                    <action android:name="android.app.action.DEVICE_ADMIN_ENABLED"/>
                    <action android:name="android.app.action.ACTION_PASSWORD_CHANGED"/>
                    <action android:name="android.app.action.ACTION_PASSWORD_FAILED"/>
                    <action android:name="android.app.action.ACTION_PASSWORD_SUCCEEDED"/>
                    <action android:name="android.permission.WRITE_SECURE_SETTINGS"/>
                    <action android:name="android.permission.WRITE_SETTINGS" />
                </intent-filter>
            </receiver>


    В .Receiver.AdminReceiver.java:
    import android.app.admin.DeviceAdminReceiver;
    import android.app.admin.DevicePolicyManager;
    import android.content.ComponentName;
    import android.content.Context;
    import android.content.Intent;
    import android.widget.Toast;
    
    public class AdminReceiver extends DeviceAdminReceiver {
      @Override
      public void onEnabled(Context ctxt, Intent intent) {
        ComponentName cn=new ComponentName(ctxt, AdminReceiver.class);
        DevicePolicyManager mgr=
            (DevicePolicyManager)ctxt.getSystemService(Context.DEVICE_POLICY_SERVICE);
    
        mgr.setPasswordQuality(cn,
                               DevicePolicyManager.PASSWORD_QUALITY_ALPHANUMERIC);
        
        onPasswordChanged(ctxt, intent);
      }
    
      @Override
      public void onPasswordChanged(Context ctxt, Intent intent) {
        DevicePolicyManager mgr=
            (DevicePolicyManager)ctxt.getSystemService(Context.DEVICE_POLICY_SERVICE);
        String msgId = "";
    
        if (mgr.isActivePasswordSufficient()) {
          msgId="Ok";
        }
        else {
          msgId="Fail";
        }
    
        Toast.makeText(ctxt, msgId, Toast.LENGTH_LONG).show();
      }
    
      @Override
      public void onPasswordFailed(Context ctxt, Intent intent) {
    
      }
    
      @Override
      public void onPasswordSucceeded(Context ctxt, Intent intent) {
    
      }
    }


    Создайте "res/xml/device_admin.xml" и в него положите:
    <device-admin xmlns:android="http://schemas.android.com/apk/res/android">
    
    	<uses-policies>
    		<limit-password />
    		<watch-login />
    		<reset-password />
    		<force-lock />
    		<wipe-data />
    		<expire-password />
    		<encrypted-storage />
    	</uses-policies>
    
    </device-admin>


    В теге "intent-filter" указываются привилегии, полный список их можешь найти в Гугл.
    После установки приложения нужно зайти в Настройки->Безопасность->Администраторы устройства->Включить приложение.

    Соответственно, в AdminReceiver.java нужно будет подстроить под ваши нужды.
    Ответ написан
  • Как одновременно скрыть виртуальную клавиатуру и EditText?

    AlexMarken
    @AlexMarken
    Попробуй код ниже. Обращаться к методу после сброса фокуса и скрытия элемента.
    Метод работает как в Activity, так и во Fragment.

    public void closeKeyboard() {
            InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
            imm.hideSoftInputFromWindow(getCurrentFocus().getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);
    }
    Ответ написан
  • Почему Android Studio подвисает, когда работаешь с разметкой и как это устранить?

    AlexMarken
    @AlexMarken
    Потому что идёт нагрузка на графический адаптер. Скорее всего, у тебя стоит функция автоопределения графического адаптера. Если у тебя открыто только IDE и несколько средних программ, ноут будет использовать встроенный адаптер.

    Как исправить?
    Настройки -> Экономия энергии -> Выключи "Автоматическое переключение графики". По умолчанию будет использоваться дискретка.

    Кстати, у меня MacBook Pro 15 2017 с Radeon Pro 555 2Gb на борту. Аналогичных проблем нет. Функция "Автоматическое переключение графики" всегда включена. Лагов в вёрстке разметки на Android Studio 3 при использовании встроенного GPU не наблюдаю.

    Дополнительно проверь ноут через Функциональный тест оборудования (при включении удерживай "D").
    Ответ написан
  • На каком ресурсе можно создать иконку для приложения без особых проблем?

    AlexMarken
    @AlexMarken
    Есть сайтик flaticon. Там огромный набор иконок (под Material Design имеются). Скачивание в различных форматах (png, psd и тп). Можешь взять от туда исходники в psd и редактировать, как тебе надо. Иконку с нуля - я бы выбрал PhotoShop.
    Ответ написан
  • Какой алгоритм использовать для нахождения пути в здании?

    AlexMarken
    @AlexMarken
    Помню, мы в универе тоже решали типичную задачу. Выбрал алгоритм Дейкстры, допилив его так, чтобы построение кратчайшего пути было не только в графе этажа и здания, а по всему кампусу. При этом всё быстро и отлично работало даже на самых слабых устройствах.

    Это одна из старых версий, пардон за дизайн.
    5aa42b873b401999336800.png

    Если интересует, свяжись со мной vk
    Ответ написан
  • Не работает эмулятор в Android Studio, No USB devices or running emulators detected что делать?

    AlexMarken
    @AlexMarken
    Установи себе нормальный эмулятор - Genymotion. Бесплатная версия имеется. Гораздо быстрее, чем встроенный AVD. На крайний случай, в Android SDK Tools переустанови пакет виртуальной машины для API 26.
    Ответ написан
  • Как сделать автонажатие кнопки в приложении?

    AlexMarken
    @AlexMarken
    Держи) Метод работает на любой вьюшке

    private void emulationOnTouch(View v) {
            long downTime = SystemClock.uptimeMillis();
            long eventTime = SystemClock.uptimeMillis() + 100L;
            float x = 0.0F;
            float y = 0.0F;
    
            int metaState = 0;
            MotionEvent motionEvent = MotionEvent.obtain(downTime, eventTime, 6661024, x, y, metaState);
    
            v.dispatchTouchEvent(motionEvent);
    }


    Вызывать метод так:
    Button bin;
    View v;
    
    emulationOnTouch(btn);
    emulationOnTouch(v);
    Ответ написан
  • Почему Alarm Manager перестает работать после принудительной остановки приложения?

    AlexMarken
    @AlexMarken
    Потому что AlarmManager ты запускаешь в потоке приложения. Нужно создавать отдельный сервис, в котором будешь запускать AlarmManager. Сервис надо привязывать к BootReceiver в манифесте (чтобы стартовал после запуска устройства) и в методе OnCreate MainActivity (проверяя, если сервис неактивен, запустить).

    В Google примеров куча)
    Ответ написан
  • Почему у меня появляется ошибка, при парсинге json?

    AlexMarken
    @AlexMarken
    Учимся читать лог: 55 строка, метод не является static.
    Смотрим 55 строку. Это метод onCreate, а если быть точнее операция производится внутри ListView.setOnItemClickListener.

    ParseText.execute(hashMap.get(arrayList.get(position)));


    Нужно обращаться не к классу, а к объекту parseText, который ты создал. Это всё)
    parseText.execute(hashMap.get(arrayList.get(position)));
    Ответ написан
  • Почему не могу понять, что находится в запросе от клиента к серверу?

    AlexMarken
    @AlexMarken
    Помню, отвечал тебе на вопрос по БД))
    Информация зашифрована. В теории расшифровать можно, но необходимо узнать метод шифрования, а потом подобрать ключ. Для этого требуются огромные мощности железа и очень много времени (в зависимости от длины и словаря ключа).

    Какие ещё варианты? Никакие, если игра не предоставляет открытый API (у неё частный). Информация зашифрована, стоят многочисленные проверки на доступ к серверу, SQL инъекции тоже исключены (скорее всего). Если начнёшь и дальше сервак ломать, разработчики поймут по логам, что ты хочешь натворить и закроют дыры.

    Мне интересно, что ты хочешь в итоге получить?
    Ответ написан
  • AlarmManager некорректно работает на китайфонах, как решить данную проблему?

    AlexMarken
    @AlexMarken
    Нужно сделать неубиваемый сервис.

    1. Создаешь сервис, который будет запускать AlarmManager
    1.1 Класс сервиса:
    public class MessageService extends Service  {
        public static PendingIntent pendingIntent = null;
    
        private void serviceMessageStart() {
    
            Intent alarmIntent = new Intent(MessageService.this, AlarmReceiver.class);
            pendingIntent = PendingIntent.getBroadcast(MessageService.this, 0, alarmIntent, PendingIntent.FLAG_CANCEL_CURRENT);
    
            if (pendingIntent != null) {
                AlarmManager manager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
                manager.setRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis() + 30 * 1000, 15 * 60 * 1000, pendingIntent);
            }
        }
    
        @Nullable
        @Override
        public IBinder onBind(Intent intent) {
            return null;
        }
    
        public void onCreate() {
            super.onCreate();
    
    
            serviceMessageStart();
        }
    
        public void onDestroy() {
            super.onDestroy();
        }
    }

    1.2 Создаешь Receiver, на который будет ссылаться AlarmManager после выполнения:
    public class AlarmReceiver extends BroadcastReceiver {
        @Override
        public void onReceive(Context context, Intent intent) {
            // Выполняем свои действия
        }
    }

    1.3 Регистрируем Service и Receiver в Manifest:
    <application
            <service
                android:name="ИМЯ.ПАКЕТА.ПРИЛОЖЕНИЯ.MessageService"
                android:enabled="true"
                android:exported="false">
            </service>
    
            <receiver android:name="ИМЯ.ПАКЕТА.ПРИЛОЖЕНИЯ.BootReceiver">
                <intent-filter>
                    <action android:name="android.intent.action.BOOT_COMPLETED" />
                </intent-filter>
            </receiver>
    </application>

    2. MainActivity. В манифесте мы прописали, чтобы сервис запускался автоматически, как только устройство будет включено. Так же мы уже сделали его неубиваемым. Теперь сделаем активацию сервиса, если он не был запущен:
    public boolean isServiceRunning(Class<?> serviceClass) {
            ActivityManager manager = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);
            for (ActivityManager.RunningServiceInfo service : manager.getRunningServices(Integer.MAX_VALUE)) {
                if (serviceClass.getName().equals(service.service.getClassName())) {
                    return true;
                }
            }
            return false;
        }
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            //...
            if(!isServiceRunning(MessageService.class)) {
                startService(new Intent(this, MessageService.class));
            }
            //...
        }


    Готово :)
    Ответ написан
  • Почему приложение вылетает с ошибкой?

    AlexMarken
    @AlexMarken
    Скинь лог (Logcat) ошибки.

    UPD:
    Cpper, посмотрел Ваш код. К сожалению, у меня на Genymotion нет Bluetooth, чтобы проверить.
    Меня насторожили эти строчки в методе macsave:
    OutputStream outputStream = null;
            try {
                outputStream = openFileOutput(fileName, 0);
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            }
            OutputStreamWriter osw = new OutputStreamWriter(outputStream);


    1:
    Для того, чтобы открыть файл в режиме Write, требуется соответствующее разрешение в Manifest. Это касается выполнения outputStream = openFileOutput(fileName, 0).
    Далее...Раз у Вас нет разрешения на выполнение записи данных, outputStream останется NULL. В этом случае, при создании потока записи данных "new OutputStreamWriter(outputStream)", приложение выдаст ошибку (outputStream является NULL).

    2:
    Убедитесь, что открываемый файл существует ("macadress.txt"). В противном случае, его необходимо создать (требуются права на WRITE).

    3:
    Ещё один момент, неверно указан путь до файла. Если файл лежит в папке приложения, путь указывается следующий: "//data//data//НАЗВАНИЕ ПАКЕТА//macadress.txt".
    Ответ написан
  • Как программно получить название разрешения?

    AlexMarken
    @AlexMarken
    Вот статья на Android Developers. Там всё, что тебе надо.

    UPD:
    Код для получения наименования разрешения.
    PackageManager pm = this.getPackageManager();
    
            try {
                PermissionInfo info = pm.getPermissionInfo(Manifest.permission.ACCESS_FINE_LOCATION, 0);
                Log.d("TEST.PERM", info.loadLabel(pm).toString());
            } catch (PackageManager.NameNotFoundException e) {
                e.printStackTrace();
                Log.d("TEST.PERM", "ERROR");
            }
    Ответ написан
  • Как найти к какому серверу подключается мобильная игра?

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

    Во-вторых, информация о подключении к БД (хост, логин, пароль, наименование БД) находится на самом сервере. Никто не будет размещать эти данные внутри приложения. Получение приложением информации из БД происходит через сервер по средствам API:
    1. Приложение отправляет HTTP(S) запрос серверу. К примеру, проверь Email - localhost/api?action=email.check&email=test@gmail.com
    2. Сервер обрабатывает запрос, проверяя его на наличие SQL инъекции (в идеале), и только потом, если это необходимо, идет обращение к БД.
    3. Предположим, что сервер соединился с БД. Взял некую информацию и отправил ответ назад - приложению.

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

    Советую почитать про клиент-серверные приложения и SQL инъекции :) Да и не всё так просто. Напрямую к БД подключиться ты не сможешь. Как правило, backend защищен от таких "взломов".
    Ответ написан
  • Как создать tabs во фрагменте?

    AlexMarken
    @AlexMarken
    Помещаешь TabItem на разметку TabLayout. Вот пример:

    <android.support.design.widget.TabLayout
        android:id="@+id/tabLayout"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        app:tabIndicatorColor="@color/white"
        app:tabMode="scrollable"
        app:tabSelectedTextColor="@color/colorText"
        app:tabTextColor="@color/colorSecondaryText">
    
        <android.support.design.widget.TabItem
          android:id="@+id/tabItem1"
          android:layout_width="wrap_content"
          android:layout_height="wrap_content"
          android:text="Tab1" />
    </android.support.design.widget.TabLayout>
    Ответ написан
  • Какую бд для хранения данных для приложения посоветуете?

    AlexMarken
    @AlexMarken
    На первоначальном этапе можно использовать и хостинг. С ростом проекта придется перейти на VPS/VDS.
    Почему сначала хостинг, а только потом VDS? Всё просто. Вначале тебе не нужно много мощности - с ростом пользователей, когда почувствуешь, что хостинг уже скоро не будет справляться с твоими задачами, перейдёшь на VDS/VPS. Если же сейчас возьмёшь VDS, ресурсы сервера будут простаивать, а ты - переплачивать за его ненужные на текущий момент ресурсы.
    Ответ написан