You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Kivy应用移植Android后无图片显示、无音频输出问题求助

Kivy Android应用问题求助:图片不显示+无音频输出

我是Kivy纯新手,用KivyApp to APK Colab把应用打包到Android后遇到两个问题:

  • Logo占位图无法显示
  • 点击按钮没有音频输出
    已经搜过各种方案但没解决,附上主文件和kv文件代码,求指点。

主文件代码

from kivy.lang import Builder
from kivy.core.audio import SoundLoader
from kivy.uix.screenmanager import Screen, ScreenManager
from kivymd.app import MDApp

Builder.load_file('mainscreen.kv')

class MainScreen(Screen):

    def __init__(self, **kwargs):
        super().__init__(**kwargs)

    #Engine ON and OFF
    def start_engine(self):
        self.start = SoundLoader.load("C:/Users/Jobert Jr/Desktop/KAEYC/audio-assets/start.ogg")
        self.start.play()

    def stop_engine(self):
        self.start.stop()

    #Alarm ON and OFF
    def play_alarm(self): 
        self.alarm = SoundLoader.load("C:/Users/Jobert Jr/Desktop/KAEYC/audio-assets/alarm.ogg")
        self.alarm.play()
    
    def stop_alarm(self):
        self.alarm.stop()
    
    #Horn
    def play_horn(self):
        self.horn = SoundLoader.load("C:/Users/Jobert Jr/Desktop/KAEYC/audio-assets/horn.ogg")
        self.horn.play()        


class MyScreenManager(ScreenManager):
    pass

class KAEYC(MDApp):
    def build(self):
        screen_manager = MyScreenManager()

        play_screen = MainScreen(name="play")

        screen_manager.add_widget(play_screen)
        return MainScreen()

if __name__ == "__main__":
    KAEYC().run()

kv文件代码

<MainScreen>
    orientation: 'vertical'
    Image:
        source: 'C:/Users/Jobert Jr/Desktop/KAEYC/image-assets/logo.jpg'
        pos_hint: {'center_x': 0.5,'center_y': 0.8}
        size_hint: .4,.4
    Label:
        text: "KAEYC - ANTI THEFT SYSTEM"
        font_size: 40
        color: (219, 77, 77)
        pos_hint: {'center_x': 0.5,'center_y': 0.6}

    Label:
        text: "CONTROLS"
        font_size: 30
        color: (255, 0, 0)
        pos_hint: {'center_x': 0.5,'center_y': 0.5}

    MDRectangleFlatButton:
        text: "Start"
        on_press: root.start_engine()
        pos_hint: {'center_x': 0.2,'center_y': 0.35}
        size_hint: .1, .1
    MDRectangleFlatButton:
        text:"Stop"
        on_press:root.stop_engine()
        pos_hint:{'center_x': 0.5,'center_y': 0.35}
        size_hint: .1, .1
    MDRectangleFlatButton:
        text:"Lights"
        pos_hint:{'center_x': 0.8,'center_y': 0.35}
        size_hint: .1, .1
    MDRectangleFlatButton:
        text:"Alarm ON"
        on_press:root.play_alarm()
        pos_hint:{'center_x': 0.2,'center_y': 0.2}
        size_hint: .1, .1
    MDRectangleFlatButton:
        text:"Alarm OFF"
        on_press:root.stop_alarm()
        pos_hint:{'center_x': 0.5,'center_y': 0.2}
        size_hint: .1, .1
    MDRectangleFlatButton:
        text:"Horn"
        on_press:root.play_horn()
        pos_hint:{'center_x': 0.8,'center_y': 0.2}
        size_hint: .1, .1

问题解决办法

1. 核心问题:绝对路径不兼容Android

你用的Windows绝对路径(C:/Users/...)在Android系统完全无效,必须改用相对路径,还要确保资源被正确打包。

步骤:

  • 调整项目结构,把资源放到项目根目录的子文件夹:
    KAEYC/
    ├── main.py
    ├── mainscreen.kv
    ├── assets/
    │   ├── images/
    │   │   └── logo.jpg
    │   └── audio/
    │       ├── start.ogg
    │       ├── alarm.ogg
    │       └── horn.ogg
    
  • 修改代码里的路径:
    • 主文件音频路径改成相对路径,比如start_engine方法:
      self.start = SoundLoader.load("assets/audio/start.ogg")
      
    • kv文件图片路径改成:
      source: 'assets/images/logo.jpg'
      

2. 音频优化:提前加载+判空

每次点击按钮重新加载音频不仅效率低,还容易在Android上加载失败,建议在初始化时提前加载:

class MainScreen(Screen):
    def __init__(self, **kwargs):
        super().__init__(**kwargs)
        # 提前加载所有音频
        self.start_sound = SoundLoader.load("assets/audio/start.ogg")
        self.alarm_sound = SoundLoader.load("assets/audio/alarm.ogg")
        self.horn_sound = SoundLoader.load("assets/audio/horn.ogg")

    def start_engine(self):
        if self.start_sound:  # 先判断是否加载成功,避免崩溃
            self.start_sound.play()

    def stop_engine(self):
        if self.start_sound:
            self.start_sound.stop()

    def play_alarm(self): 
        if self.alarm_sound:
            self.alarm_sound.play()
    
    def stop_alarm(self):
        if self.alarm_sound:
            self.alarm_sound.stop()
    
    def play_horn(self):
        if self.horn_sound:
            self.horn_sound.play()

3. 修复ScreenManager错误

你在build方法里创建了ScreenManager,但最后返回的是MainScreen(),等于白创建了,修正:

class KAEYC(MDApp):
    def build(self):
        screen_manager = MyScreenManager()
        play_screen = MainScreen(name="play")
        screen_manager.add_widget(play_screen)
        return screen_manager  # 返回screen_manager而不是MainScreen()

4. 打包时确保资源被包含

用Colab打包时,要确认上传项目时包含整个assets文件夹,不要只传代码文件。如果用buildozer,需要在buildozer.spec里添加:

source.include_exts = py,png,jpg,kv,ogg
source.include_dirs = assets

5. 额外提示:颜色值修正

Kivy的颜色值需要是0-1之间的浮点数,你现在的(219,77,77)会显示异常,改成:

color: (219/255, 77/255, 77/255, 1)  # 加上alpha通道(不透明)

内容的提问来源于stack exchange,提问作者SanMiguelWatch

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 19:02:01