如何解决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版本不兼容导致的底层崩溃
二、代码里的关键问题修正
- 文件路径错误:你用的相对路径在安卓环境下没有写入权限,必须用应用专属存储路径。修改保存路径的代码:
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') - 表格自动列宽的兼容性问题:
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
相关产品推荐
相关产品推荐

