Android跳转系统相册获取图片或者视频等指定类型文件

225 阅读2分钟

要想访问相册首先需要获取权限

目前权限在android13以后有了较大修改,所以需要分两种情况处理。下面代码中使用的所有未提及的工具类均为AndroidUtilCode SDK中的工具类,有其他的工具类也可自行使用

Android11及以上需在Manifest.xml中申请READ_MEDIA_IMAGES以及代码中动态申请READ_MEDIA_IMAGES权限

视频音频等需要申请其他权限如READ_MEDIA_VIDEO、READ_MEDIA_AUDIO,也可直接申请全局文件访问权限MANAGE_EXTERNAL_STORAGE权限,需要主动跳转设置页

    <uses-permission android:name="android.permission.READ_MEDIA_IMAGES" />
    
PermissionUtils.permission(
                    Manifest.permission.READ_MEDIA_IMAGES
                ).callback { isAllGranted, granted, deniedForever, denied ->
                    if (isAllGranted) {
                        goAlbum()
                    } else {
                        showError("Please grant storage permission.")
                    }
                }.request()

Android11以下需申请READ_EXTERNAL_STORAGE,WRITE_EXTERNAL_STORAGE权限

    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
    
PermissionUtils.permission(
                    Manifest.permission.READ_EXTERNAL_STORAGE,
                    Manifest.permission.WRITE_EXTERNAL_STORAGE
                ).callback { isAllGranted, granted, deniedForever, denied ->
                    if (isAllGranted) {
                        goAlbum()
                    } else {
                        showError("Please grant storage permission.")
                    }
                }.request()

跳转相册图片列表的代码

    private fun goAlbum() {
        //进入相册选择·ACTION_GET_CONTENT选择如果跳到非系统文件管理的话是可以选择非图片文件的,会出现bug,比如用户可能选择一个视频或者其他的文件回来
        //val albumIntent = Intent(Intent.ACTION_GET_CONTENT)
        //ACTION_OPEN_DOCUMENT只能选择系统文件夹内的文件
        val albumIntent = Intent(Intent.ACTION_OPEN_DOCUMENT)
        albumIntent.type = "image/*"
        //albumIntent.setType("video/*") //视频
        //albumIntent.setType("audio/*") //音频
        //文档类型选择
        //albumIntent.putExtra(
                    Intent.EXTRA_MIME_TYPES,
                    arrayOf(
                        MimeType.DOC,
                        MimeType.DOCX,
                        MimeType.PDF,
                        MimeType.PPT,
                        MimeType.PPTX,
                        MimeType.XLS,
                        MimeType.XLSX,
                        MimeType.TXT
                    )
                )
        //albumIntent.setType("*/*");//无类型限制
        //可多选
        albumIntent.putExtra(Intent.EXTRA_ALLOW_MULTIPLE, true)
        startActivityForResult(albumIntent, 100)
    }
    
object MimeType {
    const val DOC: String = "application/msword"
    const val DOCX: String =
        "application/vnd.openxmlformats-officedocument.wordprocessingml.document"
    const val XLS: String = "application/vnd.ms-excel application/x-excel"
    const val XLSX: String = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"
    const val PPT: String = "application/vnd.ms-powerpoint"
    const val PPTX: String =
        "application/vnd.openxmlformats-officedocument.presentationml.presentation"
    const val PDF: String = "application/pdf"
    const val TXT: String = "text/plain"
}

选择图片返回监听

    override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
        super.onActivityResult(requestCode, resultCode, data)
        if (resultCode != RESULT_OK || requestCode != 100) return
        data?.let {
            val uriFile = UriUtils.uri2File(data.data)
            LogUtils.e("文件路径", uriFile.path)
    }

跳转视频以及音频相册列表均可使用这种方式,不过在Android13及以上的设备中需要申请相应的其他权限