package com.example.camerawatermark.camera
import android.annotation.SuppressLint
import android.content.ContentUris
import android.content.Intent
import android.graphics.Bitmap
import android.graphics.drawable.Drawable
import android.net.Uri
import android.provider.MediaStore
import android.view.ViewTreeObserver
import androidx.activity.result.contract.ActivityResultContracts
import androidx.appcompat.app.AppCompatActivity
import com.bumptech.glide.Glide
import com.bumptech.glide.request.target.CustomTarget
import com.bumptech.glide.request.transition.Transition
import com.example.camerawatermark.databinding.CameraBinding
class ImageVideoModule(private val context: AppCompatActivity, private val binding: CameraBinding) {
init {
binding.btnImageView.viewTreeObserver.addOnGlobalLayoutListener(object : ViewTreeObserver.OnGlobalLayoutListener {
override fun onGlobalLayout() {
// 控件加载完成后执行的操作
// 例如加载图片、设置监听器等
// 记得在必要的时候移除监听器,避免重复执行
// 这里可以执行 openFilePicker() 或其他你想要的操作
//openFilePicker()
displayLastMediaFromGallery()
binding.btnImageView.viewTreeObserver.removeOnGlobalLayoutListener(this)
}
})
binding.btnImageView.setOnClickListener{ openFilePicker()}//这个是可以打开图片 功能更多一些
}
// 在需要访问外部存储的功能处调用这个方法
private val getContent =context.registerForActivityResult(ActivityResultContracts.GetContent()) { uri: Uri? ->
uri?.let {
// 处理选择的内容,这里的 uri 就是用户选择的文件的 URI
if (it.toString().startsWith("content://media/external/images")) {
// 选择的是图片
Glide.with(context)
.asBitmap()
.load(it)
.into(object : CustomTarget<Bitmap>() {
override fun onResourceReady(resource: Bitmap, transition: Transition<in Bitmap>?) {
binding.btnImageView.setCircularImage(resource)
}
override fun onLoadCleared(placeholder: Drawable?) {
// Optional: Placeholder handling if needed
}
})
} else if (it.toString().startsWith("content://media/external/video")) {
// 选择的是视频
// 处理视频文件的逻辑
val videoIntent = Intent(Intent.ACTION_VIEW, it)
videoIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION) // 如果需要的话,添加读取权限
context.startActivity(videoIntent)
} else {
// 其他类型的文件
val fileIntent = Intent(Intent.ACTION_VIEW, it)
fileIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION) // 如果需要的话,添加读取权限
context.startActivity(fileIntent)
}
}
}
// 在某个函数中调用获取内容的操作
private fun openFilePicker() {
getContent.launch("image/* video/*")
}
@SuppressLint("Range")
private fun displayLastMediaFromGallery() {
val projection = arrayOf(
MediaStore.Files.FileColumns._ID,
MediaStore.Files.FileColumns.MEDIA_TYPE,
MediaStore.Files.FileColumns.DATE_ADDED,
MediaStore.Files.FileColumns.DATA
)
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 = context.contentResolver.query(
MediaStore.Files.getContentUri("external"),
projection,
selection,
null,
sortOrder
)
cursor?.use { cursor ->
if (cursor.moveToFirst()) {
val mediaType = cursor.getInt(cursor.getColumnIndex(MediaStore.Files.FileColumns.MEDIA_TYPE))
val id = cursor.getLong(cursor.getColumnIndex(MediaStore.Files.FileColumns._ID))
val contentUri = when (mediaType) {
MediaStore.Files.FileColumns.MEDIA_TYPE_IMAGE -> MediaStore.Images.Media.EXTERNAL_CONTENT_URI
MediaStore.Files.FileColumns.MEDIA_TYPE_VIDEO -> MediaStore.Video.Media.EXTERNAL_CONTENT_URI
else -> null
}
val uri = contentUri?.let { ContentUris.withAppendedId(it, id) }
uri?.let {
// 使用Glide或其他图片加载库加载URI到ImageView中
Glide.with(context)
.asBitmap()
.load(uri)
.into(object : CustomTarget<Bitmap>() {
override fun onResourceReady(resource: Bitmap, transition: Transition<in Bitmap>?) {
binding.btnImageView.setCircularImage(resource)
}
override fun onLoadCleared(placeholder: Drawable?) {
// Optional: Placeholder handling if needed
}
})
}
}
}
}
}
Android Kotlin浏览视频,相册代码
于 2025-02-13 09:31:50 首次发布