Android 13(Kotlin)图库无法打开及访问问题求助
解决方案:Android 13 下无法打开图库的问题
核心问题分析
- Android 13 权限模型变更:API 33+ 不再使用
READ_EXTERNAL_STORAGE访问媒体文件,针对图片需申请READ_MEDIA_IMAGES权限。 - Toast未触发显示:权限拒绝分支的Toast仅创建实例,未调用
.show()方法,导致你看不到权限提示。 - 部分设备对
ACTION_PICK的兼容性不如ACTION_GET_CONTENT。
分步修复
1. 更新权限配置(AndroidManifest.xml)
替换原有权限,同时兼容旧版本系统:
<!-- Android 13+ 图片访问权限 --> <uses-permission android:name="android.permission.READ_MEDIA_IMAGES" /> <!-- Android 12 及以下版本兼容 --> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" android:maxSdkVersion="32" />
2. 适配权限检查逻辑(MainActivity.kt)
根据系统版本动态选择需要申请的权限:
fun checkAndOpenGallery() { val requiredPermission = if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.TIRAMISU) { Manifest.permission.READ_MEDIA_IMAGES } else { Manifest.permission.READ_EXTERNAL_STORAGE } if (checkSelfPermission(requiredPermission) == PackageManager.PERMISSION_GRANTED) { openGallery() } else { requestGalleryPermission.launch(requiredPermission) } }
3. 修复Toast未显示问题
在权限拒绝分支添加.show():
private val requestGalleryPermission = registerForActivityResult( ActivityResultContracts.RequestPermission() ) { isGranted: Boolean -> if (isGranted) { openGallery() } else { Toast.makeText(this, "权限已拒绝,无法访问图库", Toast.LENGTH_SHORT).show() } }
4. 优化Intent兼容性(可选)
替换ACTION_PICK为兼容性更好的ACTION_GET_CONTENT:
fun openGallery() { val intent = Intent(Intent.ACTION_GET_CONTENT).apply { type = "image/*" addCategory(Intent.CATEGORY_OPENABLE) } requestImageLoad.launch(intent) }
修改后的完整MainActivity代码
package com.example.test import android.Manifest import android.content.Intent import android.content.pm.PackageManager import android.os.Bundle import android.widget.Button import android.widget.ImageView import android.widget.Toast import androidx.activity.result.contract.ActivityResultContracts import androidx.appcompat.app.AppCompatActivity class MainActivity : AppCompatActivity() { lateinit var btn: Button lateinit var imageView: ImageView override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) init() } fun init() { bindView() btn.setOnClickListener { checkAndOpenGallery() } } fun bindView() { btn = findViewById(R.id.btn) imageView = findViewById(R.id.imageView) } fun checkAndOpenGallery() { val requiredPermission = if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.TIRAMISU) { Manifest.permission.READ_MEDIA_IMAGES } else { Manifest.permission.READ_EXTERNAL_STORAGE } if (checkSelfPermission(requiredPermission) == PackageManager.PERMISSION_GRANTED) { openGallery() } else { requestGalleryPermission.launch(requiredPermission) } } fun openGallery() { val intent = Intent(Intent.ACTION_GET_CONTENT).apply { type = "image/*" addCategory(Intent.CATEGORY_OPENABLE) } requestImageLoad.launch(intent) } private val requestGalleryPermission = registerForActivityResult( ActivityResultContracts.RequestPermission() ) { isGranted: Boolean -> if (isGranted) { openGallery() } else { Toast.makeText(this, "权限已拒绝,无法访问图库", Toast.LENGTH_SHORT).show() } } private val requestImageLoad = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result -> if (result.resultCode == RESULT_OK && result.data != null) { val img = result.data?.data imageView.setImageURI(img) } } }
内容的提问来源于stack exchange,提问作者iliya
相关产品推荐
相关产品推荐

