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

Android 13(Kotlin)图库无法打开及访问问题求助

解决方案:Android 13 下无法打开图库的问题

核心问题分析

  1. Android 13 权限模型变更:API 33+ 不再使用READ_EXTERNAL_STORAGE访问媒体文件,针对图片需申请READ_MEDIA_IMAGES权限。
  2. Toast未触发显示:权限拒绝分支的Toast仅创建实例,未调用.show()方法,导致你看不到权限提示。
  3. 部分设备对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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 22:53:05