跳到主要内容

使用 Pyjnius 和 Pyobjus 调用原生 Android 和 iOS API

· 阅读需 4 分钟

在使用 Flet 构建移动应用程序时,你可能需要直接与特定于平台的 API 进行交互。无论是访问系统信息、管理蓝牙设备还是处理用户偏好设置,Kivy 的PyjniusPyobjus为将 Python 与 Java(用于 Android)和 Objective-C(用于 iOS)连接起来提供了一种无缝方式。

现在你可以将 Pyjnius 和 Pyobjus 都集成到你的 Flet 应用程序中!🚀

Android 的 Pyjnius

Pyjnius 是一个 Python 库,用于使用Java 本地接口(JNI)访问 Java 类。

添加到项目中

仅为 Android 构建添加pyjnius依赖项(为简洁起见,pyproject.toml中的其他设置被省略):

[project]
name = "pyjnius_demo"
version = "0.1.0"
dependencies = [
"flet==0.27.1"
]

[tool.flet.android]
dependencies = [
"pyjnius"
]

用法示例

以下是一些在你的 Flet Android 应用程序中如何使用 Pyjnius 的示例。

获取 Android 操作系统详细信息

from jnius import autoclass

# 获取 Build 和 Build.VERSION 类
Build = autoclass('android.os.Build')
Version = autoclass('android.os.Build$VERSION')

# 获取操作系统详细信息
device_model = Build.MODEL
manufacturer = Build.MANUFACTURER
brand = Build.BRAND
hardware = Build.HARDWARE
product = Build.PRODUCT
device = Build.DEVICE
os_version = Version.RELEASE
sdk_version = Version.SDK_INT

列出蓝牙设备

from jnius import autoclass

# Get BluetoothAdapter instance
BluetoothAdapter = autoclass('android.bluetooth.BluetoothAdapter')
bluetooth_adapter = BluetoothAdapter.getDefaultAdapter()

if bluetooth_adapter is None:
print("Bluetooth not supported on this device")
else:
if not bluetooth_adapter.isEnabled():
print("Bluetooth is disabled. Please enable it.")
else:
print("Bluetooth is enabled.")

# Get paired devices
paired_devices = bluetooth_adapter.getBondedDevices()
for device in paired_devices.toArray():
print(f"Device Name: {device.getName()}, MAC Address: {device.getAddress()}")

访问活动

应用程序主活动实例可以通过以下代码检索:

import os
from jnius import autoclass

activity_host_class = os.getenv("MAIN_ACTIVITY_HOST_CLASS_NAME")
assert activity_host_class
activity_host = autoclass(activity_host_class)
activity = activity_host.mActivity

哎呀,你基本上可以使用 Pyjnius 调用任何 Android API——有无尽的可能性!

查看完整的Flet Pyjnius 示例

有关更多 Pyjnius 示例和 API,请参考Pyjnius 文档

...或者只是使用 ChatGPT(或你最喜欢的 LLM)获取更多想法和解决方案!😅

iOS 的 Pyobjus

Pyobjus 是一个库,用于使用 Objective-C 运行时反射将 Objective-C 类作为 Python 类进行访问。

添加到项目中

仅为 iOS 构建添加pyobjus依赖项(为简洁起见,pyproject.toml中的其他设置被省略):

[project]
name = "Pyjnius"
version = "0.1.0"
dependencies = [
"flet==0.27.1"
]

[tool.flet.ios]
dependencies = [
"pyobjus"
]

用法示例

最简单的示例

from pyobjus import autoclass

NSString = autoclass('NSString')
text = NSString.alloc().initWithUTF8String_('Hello world')
print(text.UTF8String())

获取操作系统详细信息

from pyobjus import autoclass
from pyobjus.dylib_manager import load_framework, INCLUDE

# Load Foundation framework
load_framework(INCLUDE.Foundation)

# Get NSProcessInfo instance
NSProcessInfo = autoclass('NSProcessInfo')
process_info = NSProcessInfo.processInfo()

# Retrieve OS version as a string
os_version = process_info.operatingSystemVersionString.UTF8String()

print(f"iOS Version: {os_version}")

处理应用程序用户设置

from pyobjus import autoclass, objc_str

NSUserDefaults = autoclass('NSUserDefaults')

key = "pyobjus_hello_world_key"
value = "Hello, world!"

# set key
NSUserDefaults.standardUserDefaults().setObject_forKey_(objc_str(value), objc_str(key))

# get key
ret = NSUserDefaults.standardUserDefaults().stringForKey_(objc_str(key))

assert ret.UTF8String() == value

查看完整的Flet Pyobjus 示例

有关更多 Pyobjus 示例和 API,请参考Pyobjus 文档

Plyer 挑战

Kivy 团队有一个Plyer项目,它在幕后同时使用 Pyjnius 和 Pyobjus。

它尚未移植到 Flet。你可以从那里获取更多针对AndroidiOS的用法示例,或者帮助我们将其移植到 Flet。