目标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。
解决方案
- Manifest中声明权限并限制版本:
在AndroidManifest.xml中保留权限声明,同时添加maxSdkVersion,避免在API33+设备上出现不必要的权限申请提示:<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" android:maxSdkVersion="32" /> - 动态申请低版本权限:
在执行写入操作前,针对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
相关产品推荐
相关产品推荐

