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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 13:35:27