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

目标SDK33的相机App在Android9崩溃,是否仍需WRITE_EXTERNAL_STORAGE?

问题分析与解决方案

你的理解仅对Android 13(API 33)及以上系统的设备有效,低版本系统的权限规则存在差异,这就是你遗漏的核心细节:

权限规则的版本差异

  • Android 13+(API33):写入公共媒体目录(图片/视频/音频)确实无需WRITE_EXTERNAL_STORAGE权限,系统通过细粒度媒体权限(如READ_MEDIA_IMAGES)覆盖相关操作权限。
  • Android 10-12(API29-32):若应用目标SDK为33,运行在这些系统上时,系统会自动授予WRITE_EXTERNAL_STORAGE权限,无需手动申请。
  • Android 9及以下(API28及更低):写入公共媒体目录必须显式申请并获得WRITE_EXTERNAL_STORAGE权限,否则会触发你遇到的SecurityException。

解决方案

  1. Manifest中声明权限并限制版本:
    在AndroidManifest.xml中保留权限声明,同时添加maxSdkVersion,避免在API33+设备上出现不必要的权限申请提示:
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"
                    android:maxSdkVersion="32" />
    
  2. 动态申请低版本权限:
    在执行写入操作前,针对API28及以下设备,动态申请权限:
    if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.P) {
        if (ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE)
            != PackageManager.PERMISSION_GRANTED) {
            ActivityCompat.requestPermissions(
                this,
                arrayOf(Manifest.permission.WRITE_EXTERNAL_STORAGE),
                REQUEST_CODE_WRITE_STORAGE
            )
        }
    }
    
    需在onRequestPermissionsResult中处理权限申请结果,确认授权后再执行写入操作。

你遇到的错误日志

E  FATAL EXCEPTION: pool-100-thread-1
Process: com.example.appcam, PID: 17483
java.lang.SecurityException: Permission Denial: writing com.android.providers.media.MediaProvider
uri content://media/external/images/media from pid=17483, uid=10147 requires
android.permission.WRITE_EXTERNAL_STORAGE, or grantUriPermission()

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 07:15:02