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

如何解决Android Kivy应用调用Matplotlib生成PNG时崩溃问题

问题分析与解决方案

一、Buildozer配置必须调整的几个点

  • 添加依赖与后端支持:在buildozer.spec的requirements里补充matplotlib, pillow,Pillow是Matplotlib保存图片的必要依赖;同时要确保Matplotlib用非交互式后端(安卓不支持GUI后端),所以在代码最开头先设置:
    import matplotlib
    matplotlib.use('Agg')  # 必须在import pyplot之前执行
    import matplotlib.pyplot as plt
    
  • 存储权限:安卓需要明确的存储权限才能写入图片,在buildozer.spec的android.permissions中添加WRITE_EXTERNAL_STORAGE, READ_EXTERNAL_STORAGE(安卓13+可补充READ_MEDIA_IMAGES)
  • API级别兼容:建议设置android.api = 33,ndk.api = 21,避免因API版本不兼容导致的底层崩溃

二、代码里的关键问题修正

  1. 文件路径错误:你用的相对路径在安卓环境下没有写入权限,必须用应用专属存储路径。修改保存路径的代码:
    from kivy.utils import platform
    import os
    
    # 获取安卓合法的存储目录
    if platform == 'android':
        from android.storage import app_storage_path
        save_dir = app_storage_path()
    else:
        save_dir = os.getcwd()
    # 拼接完整保存路径
    save_filename = f"Popis_dolazaka_{app.category_chosen}_{target_month}_{target_year}.png"
    save_path = os.path.join(save_dir, save_filename)
    plt.savefig(save_path, bbox_inches='tight')
    
  2. 表格自动列宽的兼容性问题:the_table.auto_set_column_width在安卓的渲染环境下可能触发崩溃,建议先注释掉这行测试,如果崩溃消失,就替换成手动设置列宽:
    # 替换自动列宽为手动设置,数值根据你的表格调整
    for col_idx in range(2, len(df_result.columns)):
        the_table.set_column_width(col_idx, 0.12)
    

三、安卓端Python生成PNG的已知坑

  • 必须用非交互式后端:Matplotlib的Tk/Qt等GUI后端在安卓完全无法运行,只能用Agg、SVG这类纯渲染后端
  • 字体缺失:Matplotlib默认字体在安卓上可能不存在,导致渲染崩溃,可以指定系统自带字体:
    plt.rcParams['font.family'] = 'sans-serif'
    plt.rcParams['font.sans-serif'] = ['Roboto']  # 安卓内置字体
    
  • 权限管控:安卓10+禁止随意写入公共存储,优先用应用专属目录,避免权限被拒导致崩溃

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 14:40:10