Click here to Skip to main content
15,886,137 members
Please Sign up or sign in to vote.
0.00/5 (No votes)
I am working on an app which allow the users to record video and for that I have made the camera using surface view where I have added my own icons. I want to record video using the camera and display the video in an other activity and for that I have written some codes but the codes are not working.Here is my code



class Chooses : Activity(), SurfaceHolder.Callback {
        private var recorder: MediaRecorder? = null
        private var surfaceHolder: SurfaceHolder? = null
        private var camcorderProfile: CamcorderProfile? = null
        private var camera: Camera? = null
        var recording = false
        var usecamera = true
        var previewRunning = false
        var surfaceView: SurfaceView? = null
        var btnStart: Button? = null
        var btnStop: Button? = null
        var root: File? = null
        var file: File? = null
        var isSDPresent: Boolean? = null
        var simpleDateFormat: SimpleDateFormat? = null
        var timeStamp: String? = null
    
        @SuppressLint("SourceLockedOrientationActivity")
        public override fun onCreate(savedInstanceState: Bundle?) {
            super.onCreate(savedInstanceState)
            requestWindowFeature(Window.FEATURE_NO_TITLE)
            window.setFlags(
                WindowManager.LayoutParams.FLAG_FULLSCREEN,
                WindowManager.LayoutParams.FLAG_FULLSCREEN
            )
    
            camera?.setDisplayOrientation(90)
            val rotation: Int = this.windowManager.defaultDisplay.rotation
            var degrees = 0
    
            when (rotation) {
                Surface.ROTATION_0 -> degrees = 0
                Surface.ROTATION_90 -> degrees = 90
                Surface.ROTATION_180 -> degrees = 180
                Surface.ROTATION_270 -> degrees = 270
            }
    
            var result: Int
            requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_PORTRAIT
            setContentView(R.layout.activity_chooses)
            initComs()
            actionListener()
        }
    
    
    //
        @SuppressLint("SimpleDateFormat")
        private fun initComs() {
            simpleDateFormat = SimpleDateFormat("ddMMyyyyhhmmss")
            timeStamp = simpleDateFormat!!.format(Date())
            camcorderProfile = CamcorderProfile.get(CamcorderProfile.QUALITY_HIGH)
            surfaceView = findViewById<View>(R.id.preview) as SurfaceView
            surfaceHolder = surfaceView!!.holder
            surfaceHolder?.addCallback(this)
            btnStop = findViewById<View>(R.id.btn_stop) as Button
            surfaceHolder?.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS)
            isSDPresent = Environment.getExternalStorageState() ==
                    Environment.MEDIA_MOUNTED
    
        }
    
        @SuppressLint("SdCardPath")
        private fun initRecorder() {
            recorder?.setAudioSource(MediaRecorder.AudioSource.DEFAULT)
            recorder?.setVideoSource(MediaRecorder.VideoSource.DEFAULT)
            val cpHigh = CamcorderProfile
                .get(CamcorderProfile.QUALITY_HIGH)
            recorder?.setProfile(cpHigh)
            recorder?.setOutputFile("/sdcard/videocapture_example.mp4")
            recorder?.setMaxDuration(50000) // 50 seconds
            recorder?.setMaxFileSize(5000000) // Approximately 5 megabytes
    
        }
    
        fun onClicks(v: View?) {
            if (recording) {
                recorder!!.stop()
                recording = false
                chronometer?.setTextColor(resources.getColor(android.R.color.holo_green_light))
                chronometer?.stop()
                // Let's initRecorder so we can record again
                initRecorder()
                prepareRecorder()
            } else {
                recording = true
                recorder!!.start()
                chronometer?.base = SystemClock.elapsedRealtime()
                chronometer?.setTextColor(resources.getColor(android.R.color.holo_blue_dark))
                chronometer?.start()
    
    
            }
        }
    
        private fun actionListener() {
            btnStop?.setOnClickListener {
                if (recording) {
                    recorder!!.stop()
                    if (usecamera) {
                        try {
                            camera!!.reconnect()
                        } catch (e: IOException) {
                            e.printStackTrace()
                        }
                    }
                    recorder?.release();
                    recording = false
                    // Let's prepareRecorder so we can record again
                   prepareRecorder()
                }
            }
        }
    
        private fun prepareRecorder() {
            recorder = MediaRecorder()
            recorder!!.setPreviewDisplay(surfaceHolder!!.surface)
            if (usecamera) {
                camera?.unlock()
                recorder?.setCamera(camera)
            }
            recorder!!.setAudioSource(MediaRecorder.AudioSource.DEFAULT)
            recorder!!.setVideoSource(MediaRecorder.VideoSource.DEFAULT)
            recorder!!.setProfile(camcorderProfile)
            if (camcorderProfile!!.fileFormat == MediaRecorder.OutputFormat.MPEG_4) {
                recorder!!.setOutputFile(
                    "/sdcard/XYZApp/" + "XYZAppVideo" + ""
                            + SimpleDateFormat("ddMMyyyyHHmmss").format(Date())
                            + ".mp4"
                )
            } else if (camcorderProfile!!.fileFormat == MediaRecorder.OutputFormat.MPEG_4) {
                recorder!!.setOutputFile(
                    "/sdcard/XYZApp/" + "XYZAppVideo" + ""
                            + SimpleDateFormat("ddMMyyyyHHmmss").format(Date())
                            + ".mp4"
                )
            } else {
                recorder!!.setOutputFile(
                    "/sdcard/XYZApp/" + "XYZAppVideo" + ""
                            + SimpleDateFormat("ddMMyyyyHHmmss").format(Date())
                            + ".mp4"
                )
            }
            try {
                recorder!!.prepare()
            } catch (e: IllegalStateException) {
                e.printStackTrace()
                finish()
            } catch (e: IOException) {
                e.printStackTrace()
                finish()
            }
        }
    
        override fun surfaceCreated(holder: SurfaceHolder?) {
            println("onsurfacecreated")
            if (usecamera) {
                camera = Camera.open()
                try {
                    camera?.setPreviewDisplay(holder)
    
                    camera?.startPreview()
                    previewRunning = true
                } catch (e: IOException) {
    
                    e.printStackTrace()
                }
            }
    
        }
    
        override fun surfaceChanged(
            holder: SurfaceHolder?, format: Int, width: Int,
            height: Int
        ) {
            println("onsurface changed")
            if (!recording && usecamera) {
                if (previewRunning) {
                    camera?.stopPreview()
                }
    
                try {
                    val p = camera?.parameters
                    camcorderProfile?.videoFrameWidth?.let {
                        p?.setPreviewSize(
                            it,
                            camcorderProfile!!.videoFrameHeight
                        )
                    }
                    if (p != null) {
                        p.set("orientation", "portrait")
                    }
                    if (this.getResources().getConfiguration().orientation != Configuration.ORIENTATION_LANDSCAPE) {
    
                        camera?.setDisplayOrientation(90);
    
                    } else {
    
                        camera?.setDisplayOrientation(0);
    
                    }
                    camera?.parameters = p
                    p?.previewFrameRate  = camcorderProfile?.videoFrameRate!!
                    camera?.parameters  = p
                    camera?.setPreviewDisplay(holder)
                    camera?.startPreview()
                    previewRunning = true
                } catch (e: IOException) {
                    e.printStackTrace()
                }
    
    
            }
        }
    
        override fun surfaceDestroyed(holder: SurfaceHolder?) {
            if (recording) {
               recorder!!.stop()
                recording = false
            }
            recorder?.release()
            if (usecamera) {
                previewRunning = false
                camera?.lock();
                camera?.release()
            }
            finish()
        }
    
        companion object {
            fun megabytesAvailable(f: File): Float {
                val stat = StatFs(f.path)
                val bytesAvailable = (stat.blockSize.toLong()
                        * stat.availableBlocks.toLong())
                return bytesAvailable / (1024f * 1024f)
            }
        }
    }


What I have tried:

I am trying to record video using surface view camera and display it in other activity
Posted

This content, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)



CodeProject, 20 Bay Street, 11th Floor Toronto, Ontario, Canada M5J 2N8 +1 (416) 849-8900