Kivy程序在Android 13写入相册时启动失败,求解决方案及示例
问题说明
- 基于Kivy开发的Android应用,核心功能为将类二维码图片从黑白风格像素化为彩色风格
- 无相册写入功能的APK可正常安装运行,但包含该功能的版本启动即崩溃(启动流程需在相册中创建文件)
- 已尝试通过ChatGPT排查、更换测试设备,但始终无法实现图片写入相册,且启动崩溃问题未解决
解决方案与实现示例
针对Android 13(API 33+)的存储权限变更及Kivy适配要求,可按以下步骤处理:
1. 配置Android权限清单
在项目的AndroidManifest.xml中添加对应权限,兼顾Android 13+与低版本系统:
<!-- Android 13+ 图片写入权限 --> <uses-permission android:name="android.permission.WRITE_MEDIA_IMAGES" /> <!-- 兼容Android 12及以下版本的存储权限 --> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" android:maxSdkVersion="32" />
2. 动态申请权限(避免启动崩溃)
Android 13要求危险权限必须动态申请,不能在启动时直接执行相册写入操作,否则会因权限不足触发崩溃。使用plyer库处理权限流程:
from plyer import permissions from kivy.app import App from android.storage import primary_external_storage_path from android.media import MediaScannerConnection import os from PIL import Image class PixelQRApp(App): def on_start(self): # 启动时先检查并申请存储权限 self._check_and_request_permission() def _check_and_request_permission(self): # 根据Android版本选择对应权限 target_perm = "WRITE_MEDIA_IMAGES" if permissions.android_api_level >= 33 else "WRITE_EXTERNAL_STORAGE" if not permissions.check_permission(target_perm): permissions.request_permission( target_perm, on_granted=self._on_permission_granted, on_denied=self._on_permission_denied ) else: # 权限已就绪,执行相册文件操作 self._create_gallery_file() def _on_permission_granted(self, perm): self._create_gallery_file() def _on_permission_denied(self, perm): # 处理权限拒绝逻辑,比如弹出提示告知用户功能受限 pass def _create_gallery_file(self): # 创建应用专属相册目录 gallery_dir = os.path.join(primary_external_storage_path(), "DCIM", "PixelQR") os.makedirs(gallery_dir, exist_ok=True) # 生成示例图片(替换为你的像素化图片保存逻辑) file_path = os.path.join(gallery_dir, "colorized_qr.png") sample_img = Image.new('RGB', (200, 200), color='#2ecc71') sample_img.save(file_path) # 通知系统媒体扫描器,确保图片在相册中显示 MediaScannerConnection.scan_file(file_path) if __name__ == "__main__": PixelQRApp().run()
3. 关键注意事项
- 禁止在未获取权限的启动阶段直接操作相册,必须先完成权限申请流程
- 使用Android官方提供的媒体存储路径(如
DCIM目录),避免使用私有存储或已废弃的路径 - 写入文件后必须调用
MediaScannerConnection.scan_file(),否则系统相册无法及时识别新文件
内容的提问来源于stack exchange,提问作者Tony Nolan
相关产品推荐
相关产品推荐

