Пишем паническую кнопку под андроид (Часть 2)

в 10:47, , рубрики: android, application, development, github, huntmix, java, open source, security, story, Блог компании Huntmix apps, информационная безопасность, Разработка под android

На связи снова Алексей который спешит уже с техническими подробностями проекта) В этой части узнаем как работают триггеры в приложении и поговорим о проблемах Google Play! Данная часть будет больше предыдущей так что берите напиток по погоде и погружайтесь в статью!

Под капотом

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

Скриншоты
Главный экран
Главный экран
Выбор иконки
Выбор иконки
Какой пакет выбирать
Какой пакет выбирать
Готовый ярлык
Готовый ярлык

Все значения сохраняются в преференсы, лично я для быстрого доступа использую TinyDB, а для выбора файлов в приложении FilePicker. После добавления ярлыка с помощью вот такого кода:

Код
  public void addcustomshrt(View view){
        String iconpath = tinydb.getString("icon");
        String nameoftag = tinydb.getString("label");
        File check = new File(iconpath);
        if (check.exists() && !check.isDirectory()){

            Bitmap bitmap = BitmapFactory.decodeFile(iconpath);
            if (ShortcutManagerCompat.isRequestPinShortcutSupported(ShortcutSettings.this))
            {
                ShortcutInfoCompat shortcutInfo = new ShortcutInfoCompat.Builder(ShortcutSettings.this, "#1")
                        .setIntent(new Intent(getApplicationContext(), ShortcutLaunch.class).setAction(Intent.ACTION_MAIN))
                        .setShortLabel(nameoftag)
                        .setIcon(IconCompat.createWithBitmap(bitmap))
                        .build();
                ShortcutManagerCompat.requestPinShortcut(ShortcutSettings.this, shortcutInfo, null);
            }
            tinydb.putBoolean("short",true);
        }else{
            new AndExAlertDialog.Builder(this)
                    .setTitle(getResources().getString(R.string.error))
                    .setMessage(getResources().getString(R.string.short1))
                    .setPositiveBtnText("Ok")
                    .setCancelableOnTouchOutside(false)
                    .OnPositiveClicked(new AndExAlertDialogListener() {
                        @Override
                        public void OnClick(String input) {
                            final String rootPath = Environment.getExternalStorageDirectory().getAbsolutePath();
                            showListItemDialog("Select png, jpg, ico file", rootPath, FILE_ONLY_DIRECT_CHOICE_IMMEDIATE, PICK_DIALOG);
                        }
                    })
                    .build();

        }}
Объяснение

В этой строке мы говорим что наш ярлык открывает нужную активити которая и запускает наш заранее введенный пакет приложения:

.setIntent(new Intent(getApplicationContext(), ShortcutLaunch.class).setAction(Intent.ACTION_MAIN))
public void openapp(){
        tinydb = new TinyDB(this);
        if( tinydb.getString("apppkg").length()>3){
            Intent launchIntent = getPackageManager().getLaunchIntentForPackage(tinydb.getString("apppkg"));
            if (launchIntent != null){
                startActivity( launchIntent );
            }
        }

        finish();

    }

После чего с помощью метода finish(); приложение остаётся незаметным глазу ведь сразу закрывается, а поверх открывается выбранное

Как запускаются действия?

Тут была мини война с гуглом и miui. Если с первой можно было справиться с помощью сервиса в фоне, то миюай просто рубит автозапуск. Пришлось просто просить пользователя что бы он вручную включил эту злополучную галочку..

Есть основной сервис который запускается с помощью триггера, триггер передает какой именно сценарий применить через extra. После чего проверяется список действий и соответственно запускаются

Код запуска
Intent intent = new Intent(this, StartActions.class);
        intent.putExtra("from","shortcut");
        startService(intent);
Код обработки
if (from.equals("shortcut")){ List<String> actions = tinydb.getListString("shortactions");
            for (int i =0;i<actions.size();i++){
                if (actions.get(i).equals("Delete Apps")){try {deleteapps(clean,root,list); }catch (IOException e){e.printStackTrace();}}
                if (actions.get(i).equals("Delete files")){startdelete(list2);}
                if (actions.get(i).equals("Crypt folders")){try{ startcrypter();} catch (Exception e){e.printStackTrace();}}
                if (actions.get(i).equals("Send Sms")){sendsms(list4,msg);}
                if (actions.get(i).equals("Power off")){Intent i2 = new Intent("android.intent.action.ACTION_REQUEST_SHUTDOWN");
                    i2.putExtra("android.intent.extra.KEY_CONFIRM", true);
                    i2.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                    getApplicationContext().startActivity(i2);}
            }
        }

И так примерно для каждого триггера, так как пользователь отключает уведомление от приложения (ну мы просим :) ), удаление происходит в фоне и незаметно

Что там с маркетами?

Google Play - отдельная история. Мне удалось загрузить только самую первую публичную версию приложения, а после добавления триггера на смс гугл плей пошел в отказ. Более 10 обращений на одобрение деклараций(Обработчик по умолчанию, автоматизация устройств и т.д.) и 2-3 обращение в службу поддержки по разрешениям - результата 0, видите ли не основная функция - значит не надо. Доступ к камере, местоположению в фоне, полный доступ к памяти - одобрено. Но вот смс не в какую (Кстати у кого был опыт, может я что то не так делаю? Или есть те кто готов помочь с этим, отпишите в комментариях. Я допускаю что что-то делаю неправильно хотя что именно никто сказать не может...)

F-Droid - честно для меня (более менее уверенного пользователя линукс) стал ужасом в плане публикации приложения.. просил даже нескольких знакомых, не вышло.. так что публикация тут пока тоже отложена

Про остальные менее известные я даже не пытался, почти все свободное время уходит на разработку, а ещё нужно за что-то кушать и учёба и повышение навыков - не последнее дело

На этом пока статья подошла к концу, в следующих статьях будет бороться с прошивками, искать баги в системе защиты андроид и ещё немного интересного!

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

Автор: Huntmix

Источник


* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js