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

复制代码
相关推荐
美狐美颜SDK开放平台22 分钟前
低延迟+高清美颜:直播APP开发中的音视频与美颜SDK优化方案
人工智能·音视频·美颜sdk·直播美颜sdk·第三方美颜sdk·短视频美颜sdk
jingling55529 分钟前
Flutter | Dio网络请求实战
android·开发语言·前端·flutter
帅次1 小时前
讯飞与腾讯云:Android 实时语音识别服务对比选择
android·ios·微信小程序·小程序·android studio·android runtime
searchforAI1 小时前
我的Obsidian知识库,现在可以自动剪藏笔记到本地了
人工智能·笔记·学习·音视频·ai工具·obsidian·视频总结
NiceCloud喜云1 小时前
Claude Code 跑 HyperFrames 实测:本地生成 AI 视频素材全流程
java·运维·人工智能·自动化·json·音视频·飞书
眺望电子-ARM嵌入式2 小时前
RK3588+XS9922B:I2S-TDM多通道音频采集实例
音视频
DogDaoDao2 小时前
AV1 帧内预测核心文件 reconintra.c 源码深度解析
音视频·实时音视频·视频编解码·av1·libaom·帧内预测·reconintra.c
jiayong232 小时前
MySQL 排序规则冲突问题与 utf8mb4_general_ci 统一方案
android·mysql·ci/cd
不才小强2 小时前
live555源码分析--client流程分析2
音视频
南山有乔木7892 小时前
音频文件怎么从MP3转换成WAV?音频处理、剪辑导入都适用的教程
音视频