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
相关产品推荐
相关产品推荐

