目录
Kivy 在 Android 上的应用¶
您可以在Android设备上运行Kivy应用程序,这些设备(或多或少)需具备OpenGL ES 2.0支持(最低Android 2.2版本)。这在现代设备上是标准配置;谷歌报告称,99.9%的设备 满足此要求。
Kivy APK 是普通的 Android 应用,您可以像分发其他应用一样分发它们,包括在 Google Play 商店等平台上。它们在暂停或重启时表现正常,可以利用 Android 服务,并能够访问下文所述的大多数标准 Java API。
按照以下说明,学习如何:为Android打包您的应用、在设备上调试代码,以及:ref:使用Android API <using_android_apis>,例如用于振动和读取传感器。
用于Android的包¶
Kivy 项目提供了在 Android 上打包应用所需的所有工具,包括构建可分发到 Google Play 商店等市场的独立 APK 或 AAB。这在 为Android创建一个包。 文档中有详细说明。
在Android平台上调试你的应用程序¶
你可以通过Android logcat流查看代码的正常输出(stdout、stderr)以及Kivy的常规日志。这需要通过`Android SDK <https://developer.android.com/sdk/index.html>`_提供的adb来访问。你可能需要在设备的开发者选项中启用adb,然后将设备连接到计算机并运行:
adb logcat
你将看到所有日志,包括你的stdout/stderr和Kivy日志。
如果你使用Buildozer打包应用,`adb`工具可能不在你的:code:`$PATH`中,上述命令可能无法工作。你可以改为运行:
buildozer android logcat
要运行由Buildozer安装的版本,或可在 $HOME/.buildozer/android/platform 路径下找到SDK工具。
你也可以使用Kivy Launcher来运行和调试你的应用程序。如果通过这种方式运行应用,你会在应用程序文件夹内的“/.kivy/logs”子文件夹中找到日志文件。
使用Android API¶
尽管Kivy是一个Python框架,但Kivy项目维护了一些工具,以便轻松使用常规的Java API,涵盖从振动、传感器到通过短信或电子邮件发送消息等各种功能。
对于新用户,我们推荐使用 Plyer。如需更高级的访问或当前未封装的API,您可以直接使用 Pyjnius。Kivy 还提供了一个 android 模块,用于基本的 Android 功能。
用户贡献的Android代码和示例可在`Kivy wiki <https://github.com/kivy/kivy/wiki#mobiles>`_上获取。
Plyer¶
Plyer 是一个Python风格的、平台无关的API,用于访问各种平台上常见的功能,尤其是移动平台。其理念是,您的应用可以简单地调用一个Plyer函数,例如向用户显示通知,而Plyer将负责以正确的方式实现这一功能,无论平台或操作系统如何。在内部,Plyer使用Pyjnius(在Android上)、Pyobjus(在iOS上)以及桌面平台上的一些特定平台API。
例如,以下代码会使您的Android设备振动,或在没有相应硬件的桌面等其他平台上引发一个您可以适当处理的NotImplementedError:
from plyer import vibrator
vibrator.vibrate(10) # vibrate for 10 seconds
Plyer 支持的 API 列表正在快速增长,您可以在 Plyer 的 README 中查看完整列表。
Pyjnius¶
Pyjnius 是一个 Python 模块,允许你直接从 Python 访问 Java 类,自动将参数转换为正确的类型,并让你轻松地将 Java 结果转换为 Python。
Pyjnius 可以从 github 获取,并且拥有其 独立的文档。
以下是一个简单示例,展示了Pyjnius访问标准Android振动API的能力,其结果与上述plyer代码相同:
# 'autoclass' takes a java class and gives it a Python wrapper
from jnius import autoclass
# Context is a normal java class in the Android API
Context = autoclass('android.content.Context')
# PythonActivity is provided by the Kivy bootstrap app in python-for-android
PythonActivity = autoclass('org.renpy.android.PythonActivity')
# The PythonActivity stores a reference to the currently running activity
# We need this to access the vibrator service
activity = PythonActivity.mActivity
# This is almost identical to the java code for the vibrator
vibrator = activity.getSystemService(Context.VIBRATOR_SERVICE)
vibrator.vibrate(10000) # The value is in milliseconds - this is 10s
这段代码直接遵循Java API函数来调用振动器,Pyjnius会自动将API转换为Python代码,并将我们的调用转换回等效的Java代码。与Plyer的版本相比,它更加冗长且更接近Java风格,但在这种情况下并无优势,尽管Plyer并未封装Pyjnius可用的所有API。
Pyjnius 还具备实现 Java 接口的强大能力,这对于封装某些 API 非常重要,但此处未作详细说明——您可以参阅 Pyjnius 的 官方文档。
Android 模块¶
python-for-android 包含一个 Python 模块(实际上是 Cython 封装 Java),用于访问有限的 Android API 集合。这一功能在很大程度上已被上述更灵活的 Pyjnius 和 Plyer 所取代,但偶尔仍可能有用。可用的函数列表见 python-for-android 文档。
这包括计费/IAP(应用内购买)以及创建/访问Android服务的代码,这些功能在上述其他工具中尚不可用。
项目状态与已测试设备¶
这些章节此前描述了Kivy的Android构建工具的存在、它们的局限性以及一些已知可用的设备。
Android 工具现已相当稳定,应能与几乎所有设备兼容;我们的最低要求是 OpenGL ES 2.0 和 Android 2.2。这些现在非常普遍——Kivy 甚至已在 Android 智能手表上运行!
由于Kivy在大多数设备上运行良好,支持的手机/平板列表已退役——所有Android设备只要满足上述条件,均可能正常工作。