Android Kotlin浏览视频,相册代码

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
                            }
                        })
                }
            }
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

魔兽-SS

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值