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

Декомпилируем приложение 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
Комментарии2

Публикации

Истории

Работа

Swift разработчик
29 вакансий
iOS разработчик
22 вакансии

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