Пишем паническую кнопку под андроид (Часть 2)
На связи снова Алексей который спешит уже с техническими подробностями проекта) В этой части узнаем как работают триггеры в приложении и поговорим о проблемах 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 actions = tinydb.getListString("shortactions");
for (int i =0;i
И так примерно для каждого триггера, так как пользователь отключает уведомление от приложения (ну мы просим :)), удаление происходит в фоне и незаметно
Что там с маркетами?
Google Play — отдельная история. Мне удалось загрузить только самую первую публичную версию приложения, а после добавления триггера на смс гугл плей пошел в отказ. Более 10 обращений на одобрение деклараций (Обработчик по умолчанию, автоматизация устройств и т.д.) и 2–3 обращение в службу поддержки по разрешениям — результата 0, видите ли не основная функция — значит не надо. Доступ к камере, местоположению в фоне, полный доступ к памяти — одобрено. Но вот смс не в какую (Кстати у кого был опыт, может я что то не так делаю? Или есть те кто готов помочь с этим, отпишите в комментариях. Я допускаю что что-то делаю неправильно хотя что именно никто сказать не может…)
F-Droid — честно для меня (более менее уверенного пользователя линукс) стал ужасом в плане публикации приложения. просил даже нескольких знакомых, не вышло. так что публикация тут пока тоже отложена
Про остальные менее известные я даже не пытался, почти все свободное время уходит на разработку, а ещё нужно за что-то кушать и учёба и повышение навыков — не последнее дело
На этом пока статья подошла к концу, в следующих статьях будет бороться с прошивками, искать баги в системе защиты андроид и ещё немного интересного!
Все ваши идеи я тоже читаю и записываю, но увы я могу уделять приложению пока что нет так много времени как хотелось бы!…