您好,登录后才能下订单哦!
密码登录
登录注册
点击 登录注册 即表示同意《亿速云用户服务条款》
# 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" />
对于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()
}
}
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
}
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开始:
// 在AndroidManifest中添加
<application
android:requestLegacyExternalStorage="true"
... >
val externalStorageVolumes = ContextCompat.getExternalFilesDirs(
context,
null
)
val primaryExternalStorage = externalStorageVolumes[0]
// 遍历DCIM目录
val dcimDir = File(primaryExternalStorage.absolutePath + "/DCIM")
dcimDir.listFiles()?.forEach { file ->
// 过滤图片文件
}
val thumbnail = ContentResolver.loadThumbnail(
contentResolver,
uri,
Size(256, 256),
null
)
Glide.with(context)
.load(uri)
.override(600, 600)
.into(imageView)
CoroutineScope(Dispatchers.IO).launch {
val photos = getAllPhotos(context)
withContext(Dispatchers.Main) {
adapter.submitList(photos)
}
}
[GitHub Gist链接](示例代码仓库地址)
ACTION_OPEN_DOCUMENT_TREE
通过以上方法,您可以高效地获取Android设备相册中的所有照片。建议始终遵循最小权限原则,并在应用中提供清晰的权限说明。 “`
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。