• Тормозит новый MacBook Pro 15” 2017, нормально ли это?

    AlexMarken
    @AlexMarken
    MBP 15'' 2017 минимальной комплектации: перезагрузка раз в неделю, одновременная работа с Android Studio, Genymotion (эмулятор Android), MAMP, phpStorm, 12-20 вкладок Safari, Trello, иногда Windows 10 на Parallels - фризов нет.

    Переустанови начисто систему, возможно было кривое обновление. Если не поможет, неси в сервис.
    Ответ написан
    Комментировать
  • Как решить проблемы с клавиатурой MacBook Pro 2017?

    AlexMarken
    @AlexMarken
    Дело не в том, что MBP не предназначен для дороги. У прошек 2016-2017 есть проблема с клавиатурой. Мелкая пыль, попадая под клавиши, мешает работе клавиатуры.

    За 9 месяцев использования прошки 2017 залипание клавиш было лишь 2 раза. Помогал баллончик с жатым воздухом.

    Если после этого проблема не решится, неси в сервис.
    Ответ написан
    Комментировать
  • Как отправить СМС в 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 нужно будет подстроить под ваши нужды.
    Ответ написан
    3 комментария
  • Какой MacBook лучше для разработки в Xcode(варианты прилагаю)?

    AlexMarken
    @AlexMarken
    Из представленного списка, явно, самая мощная и выгодная модель MacBook Pro 2015 15”:
    1. Оперативка. 8 Gb маловато для разработки ПО, 16 - в самый раз.
    2. Размер экрана. Лично мне, 13.3 дюйма мало для разработки. Мониторы не подключаю.
    3. В принципе, пятнашка 2015 по производительности выигрывает 13 дюймовые версии 2016-2017.

    Бери 15''. Иначе, попросту не будет хватать памяти для одновременной работы в различных IDE и эмуляторах.
    Жалеть денег на то, что будет приносить прибыль, не надо)
    Ответ написан
    3 комментария
  • Как одновременно скрыть виртуальную клавиатуру и 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.
    Ответ написан
    1 комментарий
  • Какой алгоритм использовать для нахождения пути в здании?

    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);
    Ответ написан
    Комментировать
  • Как вы решаете проблему нехватки места на макбуках с Ретиной?

    AlexMarken
    @AlexMarken
    1. Однозначно, Retina с 256 ГБ. Экраном жертвовать не надо
    2. Очистить цифровой мусор
    3. Нужный (не необходимый) мусор хранить на съёмных носителях
    4. Backup только на внешний носитель, ничего трудного
    5. Можно купить 50 ГБ в iCloud за 59 руб/м

    У меня на борту SSD на 256 ГБ, из них свободно 125. phpStorm, xCode, Android Studio, Genymotion c несколькими образами Android, DataGrip, MAMP, Parallels с Windows 10, MS Office и ещё несколько приложений, музыка на 20 Гб, активные рабочие проекты, фото с iCloud.

    Фильмы, backup'ы и прочий шлак храню на внешних HDD. Дополнительно взял 200 Гб в iCloud под неотложные нужны.
    Ответ написан
  • Почему 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)));
    Ответ написан
    1 комментарий
  • Проблема с резиновым уплотнителем на MacBook Pro 2017 или паранойя?

    AlexMarken
    @AlexMarken
    15 2017. Уплотнитель за рамку не выходит. У тебя же очень заметно, что уплотнитель налезает на экран. Неси в СЦ, сборка корявая - гарантийный случай.
    5a5c50d1a27f3713310599.jpeg
    Ответ написан
  • Почему не могу понять, что находится в запросе от клиента к серверу?

    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 защищен от таких "взломов".
    Ответ написан
    Комментировать