废话不多说,直接看效果:
| 录像 | 拍照 | 文件选取(获取第一帧图片) | 
|---|---|---|
![]()  | 
![]()  | 
![]()  | 
注:
- 录像/拍照是使用的一个开源框架,里面的东西稍作了调整.原地址我找不到了(如有雷同,请私信联系我,本篇只当做笔记来记录!)
 
工作前的准备
本篇涉及到了使用相机,保存文件等操作,所以需要先申请权限
权限申请是采用郭霖大佬的开源库 permissionX
直接贴上完整代码:
//申请权限
    private fun initPermission() {
        PermissionX.init(this)
            .permissions(
                Manifest.permission.READ_EXTERNAL_STORAGE,
                Manifest.permission.WRITE_EXTERNAL_STORAGE,
                Manifest.permission.RECORD_AUDIO,
                Manifest.permission.CAMERA
            )
            //onExplainRequestReason当用户拒绝权限的时候执行
            .onExplainRequestReason { deniedList ->
                showRequestReasonDialog(deniedList, "即将重新申请的权限是程序必须依赖的权限", "我已明白", "取消")
            }
            //onForwardToSettings 监听用户永久拒绝的权限
            .onForwardToSettings {
                showForwardToSettingsDialog(it, "您需要去应用程序设置当中手动开启权限", "我已明白", "取消")
            }
            /**
             * 参数一: 所有权限是否通过
             * 参数二: 用于记录所有已被授权的权限,
             * 参数三: 用于记录所有被拒绝的权限。
             */
            .request { allGranted, _, _ ->
                run {
                    if (allGranted) {
                        //权限通过了
                    } else {
                        showToast("权限未通过")
                    }
                }
            }
    }
复制代码
记得在 AndroidManifest.xml 中申请哦

在 Android10(targetSdkVersion >= 29) 以上存储文件还需要添加一个:

拍照/视频录像
跳转到CameraActivity页面即可,CameraActivity页面是 library,下载完整 Demo 导入进去即可
- maxTime 为拍摄时间最大值(单位:s)默认 15s
 - minTime 为拍摄时间最小值(单位:s)默认 1s
 
        val intent = Intent(this, CameraActivity::class.java)
        //设置拍摄最大值 单位:秒
        intent.putExtra("maxTime", 20)
        //设置拍摄最小值 单位:秒
        intent.putExtra("minTime", 1)
        startActivityForResult(intent, 100)
复制代码
接收CameraActivity页面的回调
- 101 为成功 回调图片路径
 - 103 为没有没有权限
 - 104 为视频文件回调(下面会用)
 
 override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
        super.onActivityResult(requestCode, resultCode, data)
        Log.i("szjCode", "$resultCode\t$requestCode")
        if (resultCode == 101) {
            val path = data?.getStringExtra("path")
            //设置回调第一帧照片
            photo.setImageBitmap(BitmapFactory.decodeFile(path))
        }
        if (resultCode == 103) {
            Toast.makeText(this, "请检查相机权限~", Toast.LENGTH_SHORT).show()
        }
        //文件上传回调
        if (requestCode == 104) {
            //获取图片完整路径
            val path = ContentUriUtil.getPath(this, data?.data)
            Log.i("filepath", " = $path")
            showToast("您选择的视频完整路径为:$path")
            //获取图片第一帧 并且赋值
            getVideoThumbnail(path)
        }
    }
复制代码
在来回顾一下效果图:
| 录屏 | 拍照 | 
|---|---|
![]()  | 
![]()  | 
获取视频文件第一帧
获取视频文件第一帧首先需要获取完整的视频路径
进入视频文件选取页面(只选取视频)
        val intent = Intent()
        /* 开启Pictures画面Type设定为image */
        //intent.setType("image/*");
        // intent.setType("audio/*"); //选择音频
        intent.type = "video/*" //选择视频 (mp4 3gp 是android支持的视频格式)
        // intent.setType("video/*;image/*");//同时选择视频和图片
        /* 使用Intent.ACTION_GET_CONTENT这个Action */
        intent.action = Intent.ACTION_GET_CONTENT
        /* 取得相片后返回本画面 */
        startActivityForResult(intent, 104)
复制代码
视频文件回调
- ContentUriUtil.getPath(this, data?.data)通过 url 获取选取视频路径,这个类是我在网上找的,亲测有用
 - getVideoThumbnail() 获取视频文件第一帧
 
 override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
        super.onActivityResult(requestCode, resultCode, data)
        Log.i("szjCode", "$resultCode\t$requestCode")
           ....
           
        //文件上传回调
        if (requestCode == 104) {
            //获取图片完整路径
            val path = ContentUriUtil.getPath(this, data?.data)
            Log.i("filepath", " = $path")
            showToast("您选择的视频完整路径为:$path")
            //获取图片第一帧 并且赋值
            getVideoThumbnail(path)
        }
    }
复制代码
获取视频文件第一帧图片:
//获取视频文件第一帧图片
    private fun getVideoThumbnail(url: String?) {
        val bitmap: Bitmap?
        //MediaMetadataRetriever 是android中定义好的一个类,提供了统一
        //的接口,用于从输入的媒体文件中取得帧和元数据;
        val retriever = MediaMetadataRetriever()
        //()根据文件路径获取缩略图
        retriever.setDataSource(url);
        //获得第一帧图片
        bitmap = retriever.frameAtTime
        //设置图片
        photo.setImageBitmap(bitmap)
        //释放
        retriever.release()
    }
复制代码
最后来回顾一下效果:

课外知识
快速获取控件 Id
 //在plugins中添加 kotlin应用扩展插件
    id 'kotlin-android-extensions'
复制代码

使用:

需要添加一个导包哦: (commond + enter 直接就出来了)

这个插件出来挺久了,我是 49 年的国军,刚吧 kt 引入项目,所以刚刚知道.挺好用的推荐给和我一样不知道的同学~
原创不易,您的点赞就是对我最大的支持!
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END
    




















![[02/27][官改] Simplicity@MIX2 ROM更新-一一网](https://www.proyy.com/wp-content/uploads/2020/02/3168457341.jpg)


![[桜井宁宁]COS和泉纱雾超可爱写真福利集-一一网](https://www.proyy.com/skycj/data/images/2020-12-13/4d3cf227a85d7e79f5d6b4efb6bde3e8.jpg)

![[桜井宁宁] 爆乳奶牛少女cos写真-一一网](https://www.proyy.com/skycj/data/images/2020-12-13/d40483e126fcf567894e89c65eaca655.jpg)