【移动APP】使用Kivy为小米手机和其他Android设备开发Python应用

使用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

功能说明

  1. 设备检测

    • 自动检测是否为小米设备
    • 显示MIUI版本信息
    • 检查电池优化设置
  2. 权限管理

    • 自动请求必要的Android权限
    • 特别处理MIUI的后台限制
  3. 通知系统

    • 兼容Android 8.0+的通知渠道
    • 适配MIUI的通知限制
  4. 主题适配

    • 提供深色/浅色模式切换
    • 可扩展为自动跟随系统主题
  5. 后台运行

    • 处理MIUI的后台限制
    • 实现on_pause/on_resume生命周期

构建和安装步骤

  1. 安装依赖:

    pip install kivy buildozer
    
  2. 初始化buildozer:

    buildozer init
    

    (编辑生成的buildozer.spec文件,或使用上面提供的配置)

  3. 构建APK:

    buildozer -v android debug
    
  4. 安装到小米手机:

    • 将bin目录下的APK传输到手机
    • 在手机上允许安装未知来源应用
    • 安装后,进入设置授予所有必要权限

小米设备特别设置

安装后,建议在小米设备上进行以下设置:

  1. 电池设置

    • 进入"设置"->“电池与性能”->“应用智能省电”
    • 选择你的应用并设为"无限制"
  2. 通知设置

    • 进入"设置"->“通知管理”
    • 确保你的应用有通知权限
  3. 自启动权限

    • 进入"设置"->“应用设置”->“权限”->“自启动”
    • 允许你的应用自启动

这个完整示例涵盖了Kivy在小米/Android设备上的主要开发需求,你可以基于此进行扩展开发。

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Botiway

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值