Как стать автором
Обновить

Декомпилируем приложение xiaomi сканер и забираем результат сканирования

Время на прочтение2 мин
Количество просмотров4.9K
У коллеги возникло предложение:
«Напиши мне за банку чипсов распознавалку штрих-кодов на андроид, чтобы просто в файлики результаты писать и время, брату надо». В итоге оказалось не брату, да и не надо, и вообще банка чипсов это дорого
Из интереса пробежался по готовым решениям на js и android, и т.к. у меня смартфон xiaomi с готовым приложением сканером, подумал, почему бы не попробовать просто забирать результаты сканирования из него? Ок, пробовал погуглить инфу об интентах или готовую инструкцию по получению данных из сканера, но тщетно. Решено провести разведку манифеста приложения на наличие интентов.

  1. Находим и забираем APK с телефона.

    adb shell
    ~:/pm list packages | grep scanner
    ~:/pm path com.xiaomi.scanner
    exit
    pull /system/priv-app/MiuiScanner/MiuiScanner.apk
    
  2. Декомпилируем apk с помощью онлайн сервиса.
  3. Исследуем манифест. Находим первый попавшийся по смыслу экшн.

    AndroidManifest.xml

  4. Создаем новый android проект и пишем вызов сканера.

      val intent = Intent("miui.intent.action.scanbarcode")
       startActivityForResult(intent, 1);
    
  5. Запускаем приложение, делаем вызов и… запускается сканер и дает спокойно работать, но нужно получить результат, как? Видимо нужен корректный код запроса, или дополнительные данные в интенте. Анализируем декомпилированные исходники в части обработки интентов и попадается следующее.

    ScanActivity.java


    Судя по всему нужно добавить булево значение в интент.
  6. Ищем нужное имя ключа, которое лежит в EXTRA_INTENT_IS_BACKTO_THIRDAPP и находим isBackToThirdApp.

    AppUtils.java

  7. Переписываем код вызова сканера.

      val intent = Intent("miui.intent.action.scanbarcode")
      intent.putExtra("isBackToThirdApp",true)
      startActivityForResult(intent, 1);
    
  8. Забираем результат.

            super.onActivityResult(requestCode, resultCode, data)
            if (resultCode==Activity.RESULT_OK){
                    result.setText(data?.extras?.getString("result"))
            } 
    
  9. Короткое видео с примером работы приложения.
  10. Интерес удовлетворен, и теперь мы можем пользоваться результатами родного Xiaomi приложения и сосредоточиться на описании своей логики работы с результатами, поедая чипсы
Теги:
Хабы:
Всего голосов 11: ↑11 и ↓0+11
Комментарии2

Публикации

Истории

Работа

iOS разработчик
30 вакансий
Swift разработчик
36 вакансий

Ближайшие события

One day offer от ВСК
Дата16 – 17 мая
Время09:00 – 18:00
Место
Онлайн
Конференция «Я.Железо»
Дата18 мая
Время14:00 – 23:59
Место
МоскваОнлайн
Антиконференция X5 Future Night
Дата30 мая
Время11:00 – 23:00
Место
Онлайн
Конференция «IT IS CONF 2024»
Дата20 июня
Время09:00 – 19:00
Место
Екатеринбург
Summer Merge
Дата28 – 30 июня
Время11:00
Место
Ульяновская область