Kivy приложение не работает на Android - PullRequest
0 голосов
/ 13 марта 2019

Я хочу написать простое приложение на Python для Android, используя kivy. К сожалению, когда я запускаю пример кода, я вижу только заставку и несколько секунд спустя приложение завершает работу. Существует огромная проблема с отладкой, потому что adb в Linux Mint не обнаруживает мое устройство.

Может кто-нибудь взглянуть на мой код и сказать, почему? Для сборки приложения я использую buildozer. Вы также можете увидеть скрипт create_env, чтобы проверить наличие всех зависимостей.

С уважением. Draqun

EDIT:

Я начал отлаживать свое приложение. Вывод:

  • buildozer + python3 + kivy - плохая идея
  • если я использую kivy.uix.button.Button, когда текстовый атрибут str, чем я получил исключение "AttributeError: у объекта 'str' нет атрибута 'decode' '
  • если я использую kivy.uix.button.Button, когда атрибут текста в байтах, я получил исключение "ValueError: Button.text accept only str"

Это выглядит как петля без решения. Какая-то идея, когда мне следует сообщить об этом?

Исключение находится в файле .buildozer / android / platform / build / build / python-installs / pad / android / init .py ", поэтому он не похож на исключение kivy и / или buildozer.

1 Ответ

0 голосов
/ 21 марта 2019

Я использовал python-for android tool и столкнулся с такими же ошибками. Но в моем случае приложение вообще не запускалось - зависало на заставке. Наконец-то я нашел решение. Вы можете попробовать так же.

Таким образом, мой конвейер был python3 + python-for-android (инструмент p4a, python-for-android , из главной ветви) + kivy (1.10.1)

Существует файл "_android.pyx" для рецепта сборки Android (полный список доступных рецептов p4a вы можете увидеть командой p4a recipes). Этот файл, возможно, используется Buildozer и точно используется P4A во время процедуры сборки APK. Вам нужно это исправить.

Вы можете найти его местоположение в Ubuntu (например) через:

sudo updatedb
locate _android.pyx

Это путь должен быть примерно таким:

~/.local/lib/python3.6/site-packages/pythonforandroid/recipes/android/src/android/_android.pyx

Там должна быть строка:

python_act = autoclass(JAVA_NAMESPACE.decode('utf-8') + u'.PythonActivity')

так что вы должны изменить это - что-то вроде этого:

python_act = autoclass(str(JAVA_NAMESPACE) + u'.PythonActivity'),

или просто использовать жесткий код:

python_act = autoclass("org/kivy/android/PythonActivity")

Или в источниках может быть другое использование decode ().

Причина: различия между Python2 и Python3 - метод decode () может использоваться для эквивалентного двоичного типа данных в Python 2 или 3, но он не может использоваться текстовым типом данных последовательно между Python 2 и 3 потому что str в Python 3 не имеет метода декодирования, функция имеет другую реализацию в Python3. Более подробная информация здесь: Pyporting Features выпускает p4a's github

Надеюсь, это вам как-то поможет.

...