Android 仿微信选择视频图片

1. 引言

在现代社交应用中,用户经常需要选择图片或视频文件来分享或保存。在这篇文章中,我们将介绍如何在Android应用中仿照微信的方式选择图片和视频文件。我们将使用Android的媒体选择器和存储访问框架来实现这个功能。本文将详细介绍如何使用这些功能,并提供相关的代码示例。

2. 实现步骤

2.1 添加权限和依赖

首先,我们需要在AndroidManifest.xml文件中添加访问媒体文件和存储的权限:

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

接下来,在app的build.gradle文件中添加以下依赖项:

dependencies {
    implementation 'androidx.appcompat:appcompat:1.3.0'
    implementation 'androidx.core:core-ktx:1.6.0'
    implementation 'androidx.activity:activity-ktx:1.3.1'
    implementation 'androidx.fragment:fragment-ktx:1.3.6'
    implementation 'androidx.recyclerview:recyclerview:1.2.1'
    implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.3.1'
    implementation 'com.google.android.material:material:1.4.0'
}

2.2 创建布局文件

我们需要创建一个包含图片和视频选择器的布局文件。可以使用RecyclerView来显示选择的图片和视频列表。以下是一个示例布局文件的代码:

<LinearLayout
    xmlns:android="
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <Button
        android:id="@+id/selectButton"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="选择图片和视频" />

    <androidx.recyclerview.widget.RecyclerView
        android:id="@+id/mediaRecyclerView"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

</LinearLayout>

2.3 实现选择器逻辑

在Activity或Fragment中,我们需要实现选择器逻辑。首先,我们需要定义一个数据类来表示媒体文件:

data class MediaItem(val id: Long, val uri: Uri, val type: MediaType)

接下来,我们需要定义一个适配器来显示选择的媒体文件列表:

class MediaAdapter(private val mediaList: List<MediaItem>) : RecyclerView.Adapter<MediaAdapter.ViewHolder>() {

    class ViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
        val imageView: ImageView = itemView.findViewById(R.id.imageView)
        val videoIcon: ImageView = itemView.findViewById(R.id.videoIcon)
    }

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
        val view = LayoutInflater.from(parent.context).inflate(R.layout.item_media, parent, false)
        return ViewHolder(view)
    }

    override fun onBindViewHolder(holder: ViewHolder, position: Int) {
        val mediaItem = mediaList[position]
        // 加载图片或视频缩略图
        Glide.with(holder.imageView)
            .load(mediaItem.uri)
            .into(holder.imageView)
        // 根据媒体类型显示视频图标
        if (mediaItem.type == MediaType.VIDEO) {
            holder.videoIcon.visibility = View.VISIBLE
        } else {
            holder.videoIcon.visibility = View.GONE
        }
    }

    override fun getItemCount(): Int {
        return mediaList.size
    }
}

在Activity或Fragment的代码中,我们需要使用媒体选择器和存储访问框架来获取用户选择的图片和视频列表:

class MainActivity : AppCompatActivity() {

    private lateinit var selectButton: Button
    private lateinit var mediaRecyclerView: RecyclerView
    private lateinit var mediaAdapter: MediaAdapter

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        selectButton = findViewById(R.id.selectButton)
        mediaRecyclerView = findViewById(R.id.mediaRecyclerView)
        mediaAdapter = MediaAdapter(emptyList())
        mediaRecyclerView.adapter = mediaAdapter

        selectButton.setOnClickListener { openMediaPicker() }
    }

    private fun openMediaPicker() {
        val intent = Intent(Intent.ACTION_OPEN_DOCUMENT).apply {
            addCategory(Intent.CATEGORY_OPENABLE)
            type = "image/* video/*"
            putExtra(Intent.EXTRA_ALLOW_MULTIPLE, true)
        }
        startActivityForResult(intent, REQUEST_MEDIA_PICKER)
    }

    override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
        super.onActivityResult(requestCode, resultCode, data)
        if (requestCode == REQUEST_MEDIA