Android怎么获取手机相册里所有照片

发布时间:2021-12-18 16:16:01 作者:iii
来源:亿速云 阅读:1365
# Android怎么获取手机相册里所有照片

在Android应用开发中,访问用户相册是一个常见需求。本文将详细介绍如何通过`MediaStore API`和`ContentResolver`获取手机相册中的所有照片,并处理Android 10及以上版本的存储权限变更。

## 一、准备工作

### 1. 添加权限声明
在`AndroidManifest.xml`中添加以下权限:

```xml
<!-- 外部存储读取权限(Android 9及以下需要) -->
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />

<!-- 所有文件访问权限(Android 11及以上需要特殊场景申请) -->
<uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE" 
    tools:ignore="ScopedStorage" />

2. 动态权限申请

对于Android 6.0及以上设备:

private fun checkPermissions() {
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
        when {
            ContextCompat.checkSelfPermission(
                this,
                Manifest.permission.READ_EXTERNAL_STORAGE
            ) == PackageManager.PERMISSION_GRANTED -> {
                loadImages()
            }
            shouldShowRequestPermissionRationale(...) -> {
                // 显示解释对话框
            }
            else -> {
                requestPermissions(
                    arrayOf(Manifest.permission.READ_EXTERNAL_STORAGE),
                    REQUEST_CODE
                )
            }
        }
    } else {
        loadImages()
    }
}

二、通过MediaStore查询照片

1. 基本查询方法

fun getAllPhotos(context: Context): List<Image> {
    val imageList = mutableListOf<Image>()
    
    val projection = arrayOf(
        MediaStore.Images.Media._ID,
        MediaStore.Images.Media.DISPLAY_NAME,
        MediaStore.Images.Media.DATE_ADDED,
        MediaStore.Images.Media.SIZE,
        MediaStore.Images.Media.WIDTH,
        MediaStore.Images.Media.HEIGHT
    )

    val sortOrder = "${MediaStore.Images.Media.DATE_ADDED} DESC"

    context.contentResolver.query(
        MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
        projection,
        null,
        null,
        sortOrder
    )?.use { cursor ->
        val idColumn = cursor.getColumnIndexOrThrow(MediaStore.Images.Media._ID)
        val nameColumn = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DISPLAY_NAME)
        val dateColumn = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATE_ADDED)
        
        while (cursor.moveToNext()) {
            val id = cursor.getLong(idColumn)
            val name = cursor.getString(nameColumn)
            val date = cursor.getLong(dateColumn)
            val uri = ContentUris.withAppendedId(
                MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
                id
            )
            
            imageList.add(Image(id, uri, name, date))
        }
    }
    
    return imageList
}

2. 分页加载优化

fun loadPagedPhotos(offset: Int, limit: Int): List<Image> {
    val selection = "${MediaStore.Images.Media.DATE_ADDED} < ?"
    val selectionArgs = arrayOf("$lastLoadedDate")
    
    context.contentResolver.query(
        uri,
        projection,
        selection,
        selectionArgs,
        "$sortOrder LIMIT $limit OFFSET $offset"
    )
    // ...处理逻辑同上
}

三、Android 10+的适配方案

1. 使用Scoped Storage

从Android 10开始:

// 在AndroidManifest中添加
<application
    android:requestLegacyExternalStorage="true"
    ... >

2. 直接访问相册目录(不推荐)

val externalStorageVolumes = ContextCompat.getExternalFilesDirs(
    context, 
    null
)
val primaryExternalStorage = externalStorageVolumes[0]

// 遍历DCIM目录
val dcimDir = File(primaryExternalStorage.absolutePath + "/DCIM")
dcimDir.listFiles()?.forEach { file ->
    // 过滤图片文件
}

四、性能优化建议

  1. 缩略图加载
val thumbnail = ContentResolver.loadThumbnail(
    contentResolver,
    uri,
    Size(256, 256),
    null
)
  1. 使用Glide/Picasso等库
Glide.with(context)
    .load(uri)
    .override(600, 600)
    .into(imageView)
  1. 后台线程处理
CoroutineScope(Dispatchers.IO).launch {
    val photos = getAllPhotos(context)
    withContext(Dispatchers.Main) {
        adapter.submitList(photos)
    }
}

五、完整示例代码

[GitHub Gist链接](示例代码仓库地址)

六、常见问题解决

  1. 空指针异常:检查URI是否有效
  2. 权限拒绝:动态权限处理流程
  3. Android 11文件访问:使用ACTION_OPEN_DOCUMENT_TREE
  4. 性能瓶颈:添加分页和缓存机制

通过以上方法,您可以高效地获取Android设备相册中的所有照片。建议始终遵循最小权限原则,并在应用中提供清晰的权限说明。 “`

推荐阅读:
  1. Android手机获取时区
  2. iOS 图片保存手机相册

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

android

上一篇:怎么利用PDM实现机械制造业的信息集成

下一篇:如何进行springboot配置templates直接访问的实现

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》