作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我为 Android 开发图片库应用(最小 sdk 23,目标 sdk 29)。我试图从手机中获取照片列表。这里的代码:
val list: MutableList<Photo> = mutableListOf()
val projection = arrayOf(
MediaStore.Images.Media._ID,
MediaStore.Images.Media.DATE_TAKEN,
MediaStore.Images.Media.ORIENTATION,
MediaStore.Images.Media.SIZE
)
val query = contentResolver?.query(
MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
projection,
null,
null,
MediaStore.Images.Media.DATE_TAKEN + " DESC"
)
query?.use { cursor ->
if (cursor.count != 0) {
val idIndex = cursor.getColumnIndex(MediaStore.Images.Media._ID)
val sizeIndex = cursor.getColumnIndex(MediaStore.Images.Media.SIZE)
while (cursor.moveToNext()) {
val id = cursor.getLong(idIndex)
val size = cursor.getInt(sizeIndex)
val contentUri: Uri = ContentUris.withAppendedId(
MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
id
)
val photo = Photo(contentUri, size)
list.add(photo)
}
}
}
但 Android Studio 告诉我,某些 MediaStore 字段需要 API 级别 29+。 (例如 MediaStore.Images.Media.DATE_TAKEN、MediaStore.Images.Media.ORIENTATION、MediaStore.Images.Media.DATA 等)。 Screen from AS.所以我的问题是我应该如何在 29 以下的 API 上获取图像列表?工作室也对 contentResolver.loadThumbnail()
方法说了同样的话。
以及相邻的问题:在 Android 中是否可以检索相册列表?或者我应该获取所有图像的列表,然后运行它并挑选相册?
最佳答案
试试这个,它甚至可以与 API 29 一起工作:
private fun getAllImages(activity: Activity): ArrayList<Photo>? {
var cursor: Cursor? = null
var i = 0
val arrayList: ArrayList<Photo> = ArrayList()
if (cursor == null) {
val resolver = activity.contentResolver
cursor = resolver.query(
MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
null,
null,
null,
null
)
if (cursor != null) {
while (i < cursor.count) {
cursor.moveToPosition(i)
val fieldIndex: Int = cursor.getColumnIndex(MediaStore.Images.Media._ID)
val id: Long = cursor.getLong(fieldIndex)
val imageUri =
ContentUris.withAppendedId(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, id)
arrayList.add(Photo("", imageUri))
i++
}
cursor.close()
}
}
return arrayList
}
data class Photo(var name: String, var uri: Uri)
使用任何图像加载器库,例如 Glide 或 Picasso:
Glide.with(this).load(getAllImages(this)!![0].uri).into(imgView)
将此权限添加到您的 list 中,并确保授予它:
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
关于android - 如何在 API 29 以下从手机获取图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64034281/
我是一名优秀的程序员,十分优秀!