Android 从本地选择视频,用APP播放或进行其他处理

1.效果展示:

点击选择视频按钮后:

点击用相册打开后:

点击视频列表中的某个视频,会返回APP并自动播放所选视频

2.三步实现:

  1. 跳转到本地视频列表
  2. 点击想播放的视频,带回所选视频数据
  3. 播放该视频,可通过视频地址进行其他处理

3.直接上代码:

Activity:

Kotlin 复制代码
class VideoActivity(override val mContentView: Int = R.layout.activity_video) : BaseActivity() {

    private var mVideoListCode = 321
    private var mVideoView: VideoView? = null
    private var mPlayView: View? = null

    override fun initView() 
        mVideoView = findViewById(R.id.video_view)
        mPlayView = findViewById(R.id.play_view)
    }

    override fun initData() {
        LogUtil.e("initData")
        //自动开始播放
        startVideo()
    }


    @RequiresApi(Build.VERSION_CODES.R)
    override fun initListener() {
        //播放器点击
        mVideoView?.setOnClickListener {
            if (mVideoView?.isPlaying == true) {
                mVideoView?.pause()
                mPlayView?.visibility = View.VISIBLE
            } else {
                mVideoView?.start()
                mPlayView?.visibility = View.GONE
            }
        }
        //点击跳转视频列表,然后点击视频返回视频地址
        findViewById<View>(R.id.video_go_list).setOnClickListener {
            val intent = Intent(Intent.ACTION_PICK, MediaStore.Video.Media.EXTERNAL_CONTENT_URI)
            startActivityForResult(intent, mVideoListCode)
        }
    }


    private var mVideoPath: String? = null
    private fun startVideo() {
        mVideoView?.reset()
        mVideoView?.mediaPlayer = SystemMediaPlayer().apply {
            if (mVideoPath != null) {
                setDataSource(
                    this@VideoActivity, Uri.fromFile(File(mVideoPath ?: ""))
                )
            } else {
                setDataSource(
                    this@VideoActivity,
                    Uri.parse("https://vod.pipi.cn/fe5b84bcvodcq1251246104/658e4b085285890797861659749/f0.mp4")
                )
            }
        }

        mVideoView?.prepare()
        mVideoView?.start()

    }

    @Deprecated("Deprecated in Java") //返回选择的视频
    override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
        if (requestCode == mVideoListCode) {
            data?.data?.let {
                mPlayView?.visibility = View.GONE //隐藏封面
                val uri: Uri? = data.data
                //数据库查询操作。
                val cursor: Cursor? =
                    uri?.let { it1 -> contentResolver.query(it1, null, null, null, null) };
                if (cursor != null) {
                    if (cursor.moveToFirst()) {
                        mVideoPath = cursor.getString(// 视频路径:MediaStore.Audio.Media.DATA
                            cursor.getColumnIndexOrThrow(MediaStore.Video.Media.DATA)
                        )
                    }
                    cursor.close();
                }
                startVideo()
            }
        }
        super.onActivityResult(requestCode, resultCode, data)
    }

}

Layout:

bash 复制代码
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@color/purple"
    android:orientation="vertical">

    <FrameLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content">
        <org.salient.artplayer.ui.VideoView
            android:id="@+id/video_view"
            android:layout_width="match_parent"
            android:layout_height="300dp" />
        <ImageView
            android:id="@+id/play_view"
            android:src="@mipmap/play_view"
            android:layout_width="match_parent"
            android:padding="120dp"
            android:visibility="gone"
            android:background="@color/black3"
            android:layout_gravity="center"
            android:layout_height="match_parent" />
    </FrameLayout>

    <Button
        android:id="@+id/video_go_list"
        android:layout_margin="20dp"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="选择视频"/>


</LinearLayout>

4.所用资源或疑问解答:

BaseActivity?

详细代码和说明看这里:

Android BaseActivity抽象举例_android 抽象类 实例化-CSDN博客文章浏览阅读340次,点赞2次,收藏2次。该博客介绍了一个Android BaseActivity的抽象基类,用于统一管理状态栏颜色和逻辑,包括设置无标题、初始化ImmersionBar、重写onNewIntent方法以及简化启动新Activity的函数。同时提供了不使用ImmersionBar时的状态栏自定义方案。子Activity可以通过继承此类来复用这些功能。https://blog.csdn.net/qq_39731011/article/details/120524336

VideoView ?视频播放器

引入方法和使用指南看这里:
Android 超简洁的视频播放器推荐 ArtPlayer-CSDN博客文章浏览阅读1.3w次,点赞36次,收藏59次。深海最近做视频相关需求的时候, 在GitHub上找到的一个播放器:ArtPlayer 相对比其他三方的播放器来说,更加简洁和易扩展.支持内核替换ijkPlayer支持ExoPlayer支持GitHub 地址:https://github.com/maiwenchang/ArtPlayer使用起来有多简单呢? 看代码:首先加入这些依赖 别问我为什么有3个 ..._artplayerhttps://zhaoxinghai.blog.csdn.net/article/details/90672491

复制代码
相关推荐
melonbo1 小时前
使用FFmpeg将H.264码流封装为MP4
ffmpeg·音视频·h.264
恋猫de小郭2 小时前
Meta 宣布加入 Kotlin 基金会,将为 Kotlin 和 Android 生态提供全新支持
android·开发语言·ios·kotlin
aqi002 小时前
FFmpeg开发笔记(七十七)Android的开源音视频剪辑框架RxFFmpeg
android·ffmpeg·音视频·流媒体
androidwork4 小时前
深入解析内存抖动:定位与修复实战(Kotlin版)
android·kotlin
慢行的骑兵4 小时前
Android音视频探索之旅 | CMake基础语法 && 创建支持Ffmpeg的Android项目
ffmpeg·音视频
梦天20154 小时前
android核心技术摘要
android
Just_Paranoid4 小时前
华为云Flexus+DeepSeek征文|基于Dify构建音视频内容转录工作流
华为云·音视频·dify·maas·deepseek·flexusx
go54631584655 小时前
修改Spatial-MLLM项目,使其专注于无人机航拍视频的空间理解
人工智能·算法·机器学习·架构·音视频·无人机
szhangbiao6 小时前
“开发板”类APP如果做屏幕适配
android
高林雨露7 小时前
RecyclerView中跳转到最后一条item并确保它在可视区域内显示
android