Rustore и логика

На днях столкнулся вплотную с маразмом Rustore, а именно:

  • Однажды загруженное приложение apk удалить из магазина уже невозможно. Можно только скрыть
  • Т.к. приложение скрыто, а не удалено то другой разработчик загрузить это приложение (с этим именем пакета) уже не может.

Как следствие часто возникают ситуации: кто-то скачал apk твоего приложения из любого магазина приложений (например Goole Play), загрузил его в Rustore.. И всё. Ты теперь своё приложение уже никогда не загрузишь сам. Техподдержка отписывается: связывайтесь с тем кто загрузил это приложение первый и пусть передаёт приложение к тебе, написав кучу бумажек. А если связаться не удаётся? Или это вообще злоумышленник-шантажист?

У меня ситуация несколько проще: я когда то загрузил это приложение скачав из Google Play его, т.к. в Rustore его не было — разработчик не выложил. А теперь разработчик и хочет, но не может из-за меня. Вот теперь занимаемся перепиской и бумаготворчеством.. Казалось бы элементарный функционал добавить — на подобии передачи домена. Один код генерирует, другое его вставляет. И всё — передача завершена.

Android Studio: обработка сайтов с сертификатом Минкомсвязи в webview компоненте приложения

При попытке отобразить в webview компоненте сайт с сертификатом выданным Минкомсвязи, возникает ошибка проверки SSL соединения, т.к. этому корневому сертификату система не «доверяет». В частности ошибка возникает в настоящий момент при процессинге платежей банка Тинькофф и Сбербанк. В настоящий момент существует путь заставить компонент webview корректно проходить проверку сертификата на таких сайтах. Для этого в файл манифеста приложения необходимо добавить строчку вида:

А так-же в папке ресурсов добавить папку xml, и разместить там файл network_security_config.xml:

Сертификаты Минкомсвязи, соответственно нужно положить в android/src/res/raw. Скачать их можно тут

В результате проведенных манипуляций, все сайты в зоне ru, будут сначала проверяться при помощи сертификата Минкомсвязи, а в случае не успеха — встроенными сертификатами системы и установленными сертификатами пользователя.

Android: Не работает диалог выбора файла в webview

Задача: в контексте webview приложения для android, не открывается диалоговое окно выбора файла, в виду отсутствия в «базовом» варианте работы webview необходимых обработчиков. Решение описываемое в статье 2020года не работает в 2022 году

Решение: в конце 2022 года, рабочая минимальная обвязка для обработки выбора файлов такова:

Android Studio: в эмуляторе не работает интернет

Задача: По не понятной причине, в эмуляторе андроида перестает работать интернет

Решение: небольшое исследование показало, что эмулятор при запуске андроида, автоматом выставляет сервера DNS не те которые указаны у операционной системы хоста, а DNS гугла. Однако оные могут быть запрещены в политике организации.

Выход: принудительно указать DNS сервер при запуске эмулятора. Однако не всё так просто, из самой Android Studio это в настоящий момент не возможно. Однако можно запустить эмулятор из командной строки:

Пути и папки в Android

1) Системные папки

⚠️ Писать сюда никак нельзя

MethodResult
Environment.getDataDirectory()/data
Environment.getDownloadCacheDirectory()/cache
Environment.getRootDirectory()/system

2) Внешнее хранилище

⚠️ Нужны права WRITE_EXTERNAL_STORAGE

MethodResult
Environment.getExternalStorageDirectory()/storage/sdcard0
Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_ALARMS)/storage/sdcard0/Alarms
Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM)/storage/sdcard0/DCIM
Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS)/storage/sdcard0/Download
Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_MOVIES)/storage/sdcard0/Movies
Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_MUSIC)/storage/sdcard0/Music
Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_NOTIFICATIONS)/storage/sdcard0/Notifications
Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES)/storage/sdcard0/Pictures
Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PODCASTS)/storage/sdcard0/Podcasts
Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_RINGTONES)/storage/sdcard0/Ringtones

3) Папки приложения

MethodResult
getCacheDir()/data/data/package/cache
getFilesDir()/data/data/package/files
getFilesDir().getParent()/data/data/package

4) Папки приложения на внешнем носителе

MethodResult
getExternalCacheDir()/storage/sdcard0/Android/data/package/cache
getExternalFilesDir(null)/storage/sdcard0/Android/data/package/files
getExternalFilesDir(Environment.DIRECTORY_ALARMS)/storage/sdcard0/Android/data/package/files/Alarms
getExternalFilesDir(Environment.DIRECTORY_DCIM)/storage/sdcard0/Android/data/package/files/DCIM
getExternalFilesDir(Environment.DIRECTORY_DOWNLOADS)/storage/sdcard0/Android/data/package/files/Download
getExternalFilesDir(Environment.DIRECTORY_MOVIES)/storage/sdcard0/Android/data/package/files/Movies
getExternalFilesDir(Environment.DIRECTORY_MUSIC)/storage/sdcard0/Android/data/package/files/Music
getExternalFilesDir(Environment.DIRECTORY_NOTIFICATIONS)/storage/sdcard0/Android/data/package/files/Notifications
getExternalFilesDir(Environment.DIRECTORY_PICTURES)/storage/sdcard0/Android/data/package/files/Pictures
getExternalFilesDir(Environment.DIRECTORY_PODCASTS)/storage/sdcard0/Android/data/package/files/Podcasts
getExternalFilesDir(Environment.DIRECTORY_RINGTONES)/storage/sdcard0/Android/data/package/files/Ringtones
1 2 3 9