如何加入上面的代码中图片的拍摄时间,图片的文件信息,图片的参数,获取图片的存储路径,获取图片的地点
时间: 2024-04-16 09:30:03 浏览: 184
要获取图片的拍摄时间、文件信息、参数、存储路径和地点,你可以使用 `ExifInterface` 类来读取图片的 Exif 数据。以下是修改后的示例代码:
```kotlin
import android.content.ContentResolver
import android.content.Context
import android.location.Address
import android.location.Geocoder
import android.media.ExifInterface
import android.net.Uri
import android.provider.MediaStore
import java.io.IOException
import java.text.SimpleDateFormat
import java.util.*
// 获取本地相册的所有图片和视频,并显示其信息和额外数据
fun getAllMediaFiles(contentResolver: ContentResolver, context: Context) {
val projection = arrayOf(
MediaStore.Files.FileColumns._ID,
MediaStore.Files.FileColumns.DISPLAY_NAME,
MediaStore.Files.FileColumns.DATE_ADDED,
MediaStore.Files.FileColumns.MIME_TYPE,
MediaStore.Images.ImageColumns.DATE_TAKEN,
MediaStore.Images.ImageColumns.LONGITUDE,
MediaStore.Images.ImageColumns.LATITUDE
)
val selection = (MediaStore.Files.FileColumns.MEDIA_TYPE + "="
+ MediaStore.Files.FileColumns.MEDIA_TYPE_IMAGE + " OR "
+ MediaStore.Files.FileColumns.MEDIA_TYPE + "="
+ MediaStore.Files.FileColumns.MEDIA_TYPE_VIDEO)
val sortOrder = MediaStore.Files.FileColumns.DATE_ADDED + " DESC"
val cursor = contentResolver.query(
MediaStore.Files.getContentUri("external"),
projection,
selection,
null,
sortOrder
)
cursor?.use {
val idColumn = it.getColumnIndexOrThrow(MediaStore.Files.FileColumns._ID)
val nameColumn = it.getColumnIndexOrThrow(MediaStore.Files.FileColumns.DISPLAY_NAME)
val dateAddedColumn = it.getColumnIndexOrThrow(MediaStore.Files.FileColumns.DATE_ADDED)
val mimeTypeColumn = it.getColumnIndexOrThrow(MediaStore.Files.FileColumns.MIME_TYPE)
val dateTakenColumn = it.getColumnIndexOrThrow(MediaStore.Images.ImageColumns.DATE_TAKEN)
val longitudeColumn = it.getColumnIndexOrThrow(MediaStore.Images.ImageColumns.LONGITUDE)
val latitudeColumn = it.getColumnIndexOrThrow(MediaStore.Images.ImageColumns.LATITUDE)
while (it.moveToNext()) {
val id = it.getLong(idColumn)
val name = it.getString(nameColumn)
val dateAdded = it.getLong(dateAddedColumn)
val mimeType = it.getString(mimeTypeColumn)
val dateTaken = it.getLong(dateTakenColumn)
val longitude = it.getDouble(longitudeColumn)
val latitude = it.getDouble(latitudeColumn)
// 获取存储路径
val uri = Uri.withAppendedPath(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, id.toString())
val path = uri.toString()
// 获取地点
val address = getAddressFromLocation(context, latitude, longitude)
// 获取图片的额外信息
val exifInterface = try {
ExifInterface(path)
} catch (e: IOException) {
e.printStackTrace()
null
}
val dateTime: String? = exifInterface?.getAttribute(ExifInterface.TAG_DATETIME)
val fileSize: String? = exifInterface?.getAttribute(ExifInterface.TAG_FILE_SIZE)
val params: String? = exifInterface?.getAttribute(ExifInterface.TAG_MODEL)
// 执行你的操作,例如显示图片信息和额外数据
println("ID: $id")
println("Name: $name")
println("Date Added: $dateAdded")
println("MIME Type: $mimeType")
println("Date Taken: ${formatDate(dateTaken)}")
println("Longitude: $longitude")
println("Latitude: $latitude")
println("Path: $path")
println("Address: $address")
println("DateTime: $dateTime")
println("File Size: $fileSize")
println("Params: $params")
println("---------------------")
}
}
}
// 格式化日期
fun formatDate(timestamp: Long): String {
val sdf = SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.getDefault())
return sdf.format(Date(timestamp))
}
// 根据经纬度获取地址
fun getAddressFromLocation(context: Context, latitude: Double, longitude: Double): String {
val geocoder = Geocoder(context, Locale.getDefault())
val addresses: List<Address>?
var addressText = ""
try {
addresses = geocoder.getFromLocation(latitude, longitude, 1)
if (addresses != null && addresses.isNotEmpty()) {
val address = addresses[0]
val sb = StringBuilder()
for (i in 0..address.maxAddressLineIndex) {
sb.append(address.getAddressLine(i)).append("\n")
}
addressText = sb.toString().trim()
}
} catch (e: IOException) {
e.printStackTrace()
}
return addressText
}
// 在你的 Activity 或 Fragment 中调用该方法
fun getMediaFilesFromGallery(contentResolver: ContentResolver, context: Context) {
getAllMediaFiles(contentResolver, context)
}
```
在上述代码中,我添加了获取图片的额外信息和地点的功能。在 `getAllMediaFiles()` 函数中,使用 `ExifInterface` 类来读取图片的 Exif 数据,获取图片的拍摄时间、文件大小、参数等。然后,使用经纬度调用 `getAddressFromLocation()` 函数来获取图片的地点。最后,执行你的操作,例如显示图片信息和额外数据。
请注意,为了获取地点信息,你需要在 AndroidManifest.xml 文件中添加定位权限。
记得在你的 Activity 或 Fragment 中调用 `getMediaFilesFromGallery()` 方法来获取本地相册的所有图片和视频,并对它们进行操作。
阅读全文