当前位置: 首页 > article >正文

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

1.效果展示:

点击选择视频按钮后:

点击用相册打开后:

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

2.三步实现:

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

3.直接上代码:

        Activity:

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:

<?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

   

                

http://www.kler.cn/a/404410.html

相关文章:

  • 【网络云计算】2024第47周-每日【2024/11/21】周考-实操题-RAID6实操解析2
  • SpringCloud多机部署,负载均衡-LoadBalance
  • 一种程序结构设计json,多线程,避免数据竞争
  • 用指针函数寻找数组中的最大值与次大值
  • shell--第一次作业
  • 初始ArkUI
  • 缓冲区的奥秘:解析数据交错的魔法
  • C#(12) 内部类和分部类
  • 弹幕发送功能‘简单’实现
  • 数据集论文:面向深度学习的土地利用场景分类与变化检测
  • 设计模式-Adapter(适配器模式)GO语言版本
  • 2024信创数据库TOP30之达梦DM8
  • php:nginx如何配置WebSocket代理?
  • 接雨水
  • 智能工厂的设计软件 为了监管控一体化的全能Supervisor 的监督学习 之 序8 进化论及科学的信息技术创新:分布式账本/区块链/智能合约 之2
  • yolov5 数据集分享:纯干货
  • GEE 训练教程——Sentinel-1的卷积(核函数)的分析和可视化
  • this.$prompt 限制输入长度
  • Windows环境GeoServer打包Docker极速入门
  • 出海第一步:搞定业务系统的多区域部署
  • 大模型-微调与对齐-非强化学习的对齐方法
  • CSS3 动画:前端开发的动态美
  • 实现了图像处理、绘制三维坐标系以及图像合成的操作
  • 对原jar包解压后修改原class文件后重新打包为jar
  • RestTemplate应用实践总结
  • 请问有什么限制预约报名人数的微信小程序/系统?