使用Kivy为小米/Android设备开发的完整示例应用
下面是一个完整的Kivy应用示例,包含了对小米设备的特别适配,以及Android常用功能的实现。
完整代码:main.py
from kivy.app import App
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.button import Button
from kivy.uix.label import Label
from kivy.uix.togglebutton import ToggleButton
from kivy.uix.popup import Popup
from kivy.clock import Clock
from kivy.utils import platform
from kivy.core.window import Window
from kivy.logger import Logger
class XiaomiKivyApp(App):
def build(self):
# 设置窗口背景色(适配MIUI主题)
Window.clearcolor = (0.95, 0.95, 0.95, 1)
# 主布局
self.layout = BoxLayout(orientation='vertical', spacing=15, padding=20)
# 标题
self.title_label = Label(
text="小米/Android Kivy应用",
font_size='24sp',
size_hint=(1, 0.2)
)
# 设备信息标签
self.info_label = Label(
text="正在检测设备信息...",
font_size='18sp',
halign='left',
valign='top',
size_hint=(1, 0.4),
text_size=(Window.width - 40, None)
)
# 功能按钮
btn_layout = BoxLayout(spacing=10, size_hint=(1, 0.4))
self.detect_btn = Button(
text="检测设备",
background_color=(0.2, 0.6, 0.8, 1)
self.detect_btn.bind(on_press=self.detect_device)
self.notify_btn = Button(
text="显示通知",
background_color=(0.4, 0.8, 0.4, 1))
self.notify_btn.bind(on_press=self.show_notification)
self.theme_btn = ToggleButton(
text="深色模式",
group='theme',
background_color=(0.8, 0.5, 0.2, 1))
self.theme_btn.bind(on_press=self.toggle_theme)
btn_layout.add_widget(self.detect_btn)
btn_layout.add_widget(self.notify_btn)
btn_layout.add_widget(self.theme_btn)
# 添加到主布局
self.layout.add_widget(self.title_label)
self.layout.add_widget(self.info_label)
self.layout.add_widget(btn_layout)
# 初始化设备检测
Clock.schedule_once(lambda dt: self.detect_device(None), 0.5)
return self.layout
def detect_device(self, instance):
"""检测设备信息,特别适配小米设备"""
device_info = []
if platform == 'android':
try:
from jnius import autoclass
Build = autoclass('android.os.Build')
# 基本设备信息
device_info.extend([
f"制造商: {Build.MANUFACTURER}",
f"型号: {Build.MODEL}",
f"Android版本: {Build.VERSION.RELEASE}",
f"系统版本: {Build.DISPLAY}"
])
# 检查是否为小米设备
is_xiaomi = "xiaomi" in Build.MANUFACTURER.lower()
device_info.append(f"小米设备: {'是' if is_xiaomi else '否'}")
# 如果是小米设备,检查MIUI特性
if is_xiaomi:
device_info.append("\nMIUI特别信息:")
try:
SystemProperties = autoclass('android.os.SystemProperties')
miui_version = SystemProperties.get("ro.miui.ui.version.name", "未知")
device_info.append(f"MIUI版本: {miui_version}")
# 检查MIUI后台限制
PowerManager = autoclass('android.os.PowerManager')
activity = autoclass('org.kivy.android.PythonActivity').mActivity
power_manager = activity.getSystemService(PowerManager.POWER_SERVICE)
if power_manager.isIgnoringBatteryOptimizations(activity.getPackageName()):
device_info.append("电池优化: 已禁用 (后台运行不受限)")
else:
device_info.append("电池优化: 已启用 (可能限制后台运行)")
except Exception as e:
Logger.warning(f"获取MIUI信息失败: {str(e)}")
# 请求必要权限
self.request_android_permissions()
except Exception as e:
Logger.error(f"设备检测错误: {str(e)}")
device_info.append(f"\n错误: {str(e)}")
else:
device_info.append("当前运行在非Android平台")
self.info_label.text = "\n".join(device_info)
def request_android_permissions(self):
"""请求Android必要权限"""
if platform != 'android':
return
try:
from android.permissions import request_permissions, Permission
permissions = [
Permission.INTERNET,
Permission.READ_EXTERNAL_STORAGE,
Permission.WRITE_EXTERNAL_STORAGE,
Permission.POST_NOTIFICATIONS,
Permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS
]
request_permissions(permissions)
except Exception as e:
Logger.warning(f"权限请求失败: {str(e)}")
def show_notification(self, instance):
"""显示通知(适配MIUI通知限制)"""
if platform != 'android':
self.show_popup("通知", "此功能仅在Android设备上可用")
return
try:
from jnius import autoclass
PythonActivity = autoclass('org.kivy.android.PythonActivity')
NotificationBuilder = autoclass('android.app.Notification$Builder')
NotificationManager = autoclass('android.app.NotificationManager')
Context = autoclass('android.content.Context')
# 创建通知渠道(Android 8.0+需要)
if autoclass('android.os.Build$VERSION').SDK_INT >= 26:
NotificationChannel = autoclass('android.app.NotificationChannel')
channel_id = "xiaomi_kivy_channel"
channel_name = "Kivy应用通知"
importance = NotificationManager.IMPORTANCE_DEFAULT
channel = NotificationChannel(channel_id, channel_name, importance)
notification_service = PythonActivity.mActivity.getSystemService(
Context.NOTIFICATION_SERVICE)
notification_service.createNotificationChannel(channel)
# 构建通知
builder = NotificationBuilder(PythonActivity.mActivity, channel_id)
builder.setContentTitle("Kivy通知")
builder.setContentText("这是来自Kivy应用的通知")
builder.setSmallIcon(PythonActivity.mActivity.getApplicationInfo().icon)
builder.setAutoCancel(True)
# 显示通知
notification_manager = PythonActivity.mActivity.getSystemService(
Context.NOTIFICATION_SERVICE)
notification_manager.notify(1, builder.build())
self.show_popup("成功", "通知已发送")
except Exception as e:
Logger.error(f"通知发送失败: {str(e)}")
self.show_popup("错误", f"发送通知失败: {str(e)}")
def toggle_theme(self, instance):
"""切换深色/浅色主题"""
if instance.state == 'down':
Window.clearcolor = (0.1, 0.1, 0.1, 1) # 深色模式
self.title_label.color = (1, 1, 1, 1)
self.info_label.color = (1, 1, 1, 1)
else:
Window.clearcolor = (0.95, 0.95, 0.95, 1) # 浅色模式
self.title_label.color = (0, 0, 0, 1)
self.info_label.color = (0, 0, 0, 1)
def show_popup(self, title, message):
"""显示弹出消息"""
content = BoxLayout(orientation='vertical', spacing=10, padding=10)
content.add_widget(Label(text=message))
btn = Button(text="确定", size_hint=(1, 0.4))
popup = Popup(title=title, content=content, size_hint=(0.8, 0.4))
btn.bind(on_press=popup.dismiss)
content.add_widget(btn)
popup.open()
def on_pause(self):
"""应用进入后台时调用(特别处理MIUI的后台限制)"""
Logger.info("应用进入后台")
return True # 返回True允许后台运行
def on_resume(self):
"""应用回到前台时调用"""
Logger.info("应用回到前台")
self.detect_device(None) # 重新检测设备状态
if __name__ == '__main__':
XiaomiKivyApp().run()
配套的KV文件:xiaomikivyapp.kv
<XiaomiKivyApp>:
# 这个KV文件是可选的,因为我们在Python代码中已经构建了UI
# 但如果你喜欢用KV语言,可以在这里定义UI
buildozer.spec
配置文件
[app]
# 应用基本信息
title = Xiaomi Kivy App
package.name = xiaomikivyapp
package.domain = org.example
source.dir = .
source.include_exts = py,png,jpg,kv,atlas
version = 1.0
requirements = python3,kivy,android,jnius,pyjnius,kivmob
# Android特定配置
android.permissions = INTERNET,READ_EXTERNAL_STORAGE,WRITE_EXTERNAL_STORAGE,WAKE_LOCK,REQUEST_IGNORE_BATTERY_OPTIMIZATIONS,POST_NOTIFICATIONS
android.api = 30
android.minapi = 21
android.ndk = 23b
android.sdk = 31
android.arch = arm64-v8a
# 小米设备适配
android.allow_backup = true
android.uses_cleartext_traffic = true
android.ignore_permission_errors = 1
# 其他配置
orientation = portrait
fullscreen = 0
log_level = 2
功能说明
-
设备检测:
- 自动检测是否为小米设备
- 显示MIUI版本信息
- 检查电池优化设置
-
权限管理:
- 自动请求必要的Android权限
- 特别处理MIUI的后台限制
-
通知系统:
- 兼容Android 8.0+的通知渠道
- 适配MIUI的通知限制
-
主题适配:
- 提供深色/浅色模式切换
- 可扩展为自动跟随系统主题
-
后台运行:
- 处理MIUI的后台限制
- 实现on_pause/on_resume生命周期
构建和安装步骤
-
安装依赖:
pip install kivy buildozer
-
初始化buildozer:
buildozer init
(编辑生成的buildozer.spec文件,或使用上面提供的配置)
-
构建APK:
buildozer -v android debug
-
安装到小米手机:
- 将bin目录下的APK传输到手机
- 在手机上允许安装未知来源应用
- 安装后,进入设置授予所有必要权限
小米设备特别设置
安装后,建议在小米设备上进行以下设置:
-
电池设置:
- 进入"设置"->“电池与性能”->“应用智能省电”
- 选择你的应用并设为"无限制"
-
通知设置:
- 进入"设置"->“通知管理”
- 确保你的应用有通知权限
-
自启动权限:
- 进入"设置"->“应用设置”->“权限”->“自启动”
- 允许你的应用自启动
这个完整示例涵盖了Kivy在小米/Android设备上的主要开发需求,你可以基于此进行扩展开发。