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

复制代码
相关推荐
悟纤3 小时前
Suno Api V4模型无水印开发「高清音频WAV下载」 —— 「Suno Api系列」第6篇
音视频·suno·suno v4·suno ai
花追雨8 小时前
Android -- 双屏异显之方法一
android·双屏异显
小趴菜82278 小时前
安卓 自定义矢量图片控件 - 支持属性修改矢量图路径颜色
android
氤氲息9 小时前
Android v4和v7冲突
android
KdanMin9 小时前
高通Android 12 Launcher应用名称太长显示完整
android
chenjk49 小时前
Android不可擦除分区写文件恢复出厂设置,无法读写问题
android
袁震9 小时前
Android-Glide缓存机制
android·缓存·移动开发·glide
工程师老罗9 小时前
Android笔试面试题AI答之SQLite(2)
android·jvm·sqlite
gomogomono9 小时前
HDR视频技术之八:色域映射
音视频·hdr·yuv
User_undefined10 小时前
uniapp Native.js 调用安卓arr原生service
android·javascript·uni-app