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

如何用Kivy Python创建本地存储?APK部署后崩溃及图片不显示问题

Kivy应用打包APK后:保存崩溃、图片不显示问题修复

一、保存文件崩溃问题修复

1. 错误的文件写入路径

安卓系统中应用无权限写入默认工作目录,必须使用Kivy提供的user_data_dir(应用专属可写目录),同时类级别执行IO操作会导致初始化时出错,需调整:

修改MyFigure类:

class MyFigure(Widget):
    savefile = ObjectProperty(None)
    text_input = ObjectProperty(None)

    def __init__(self, **kwargs):
        super().__init__(**kwargs)
        # 获取应用专属可写路径
        self.save_file_path = os.path.join(MDApp.get_running_app().user_data_dir, 'save_file.csv')
        # 初始化CSV文件
        with open(self.save_file_path, 'w') as f:
            f.write("Shot type,X,Y\n")

    def on_touch_down(self, touch):
        self.canvas.add(Color(rgb=(46 / 255.0, 172 / 255.0, 88 / 255.0)))
        d = 10
        self.canvas.add(Ellipse(pos=(touch.x - d / 2, touch.y), size=(d, d)))
        # 使用初始化好的路径写入
        with open(self.save_file_path, 'a', newline='') as f:
            print("Made," + str(touch.x) + "," + str(touch.y), file=f)

            if touch.is_double_tap:
                self.canvas.add(Color(rgb=(220 / 255.0, 8 / 255.0, 8 / 255.0)))
                d = 10
                self.canvas.add(
                    Ellipse(pos=(touch.x - d / 2, touch.y), size=(d, d)))
                print("Missed," + str(touch.x) + "," + str(touch.y), file=f)

2. PlotScreen的save方法路径修正

原代码文件路径错误,且未处理异常,修改后:

def save(self, path, filename):
    try:
        # 确保文件名带.csv后缀
        if not filename.endswith('.csv'):
            filename += '.csv'
        target_path = os.path.join(MDApp.get_running_app().user_data_dir, filename)
        # 复制文件(避免move后丢失临时文件)
        shutil.copy(self.save_file_path, target_path)
        # 重置临时文件
        with open(self.save_file_path, 'w') as f:
            f.write("Shot type,X,Y\n")
    except Exception as e:
        # 捕获异常避免崩溃
        print(f"保存失败: {str(e)}")
    self.dismiss_popup()

3. 安卓权限配置

在buildozer.spec中添加文件读写权限:

android.permissions = WRITE_EXTERNAL_STORAGE, READ_EXTERNAL_STORAGE

二、图片无法显示问题修复

1. 打包时包含图片资源

在buildozer.spec中配置assets目录,确保images文件夹被打包:

android.add_assets = images/

项目结构需保持:

项目根目录/
├── main.py
├── app.kv
└── images/
    ├── bball_dude_new.png
    ├── dataset.png
    └── ... 其他图片

2. KV文件路径检查

确保图片路径大小写与实际文件一致(安卓路径大小写敏感),比如source: 'images/bball_dude_new.png'需匹配文件名。

3. 底部导航图标适配

MDBottomNavigationItem的icon属性仅支持Material Design图标名称,若用本地图片需替换为Button组件:

MDBottomNavigationItem:
    name: "btnSave"
    text: "Save"
    selected_color_background: 0, 0, 1, .4
    Button:
        size_hint: None, None
        size: 40,40
        background_normal: 'images/save.png'
        on_release: root.show_save()

三、调试建议

  • 使用adb logcat查看安卓设备上的崩溃日志,定位具体错误。
  • 所有文件操作前先确认权限,可借助plyer库实现权限检查。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 15:01:01