Skip to main content
Version: Android SDK v1.1.0

Components

We provide three base Recorder implementations that you can choose from depending on your case. Using them is a bit different but they all share the same functionality from the Recorder interface.

RecorderController

A RecorderController is the low level implementation that, unlike the others, is detached from the UI. You will typically hold the controller instance in a ViewModel. Optionally, for perfect state restoration during configuration changes, we also recommend that you use Android's SavedStateHandle and pass it to the controller constructor.

class RecordViewModel(state: SavedStateHandle) : ViewModel() {

val recorder = RecorderController(state)

override fun onCleared() {
super.onCleared()
recorder.release()
}
}

As you can see, the RecorderController must be released when you're done with it. In order to show the UI and start using the recorder, you must also call one of the bind methods as soon as you have a view container. For example, with a fragment:

class RecordFragment : Fragment() {

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
viewModel.recorder.bind(this, view.findViewById(R.id.container))
}

// Necessary if you use importVideo()
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
super.onActivityResult(requestCode, resultCode, data)
viewModel.recorder.onActivityResult(requestCode, resultCode, data)
}

// Needed for permission handling
override fun onRequestPermissionsResult(requestCode: Int, permissions: Array<out String>, grantResults: IntArray) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults)
viewModel.recorder.onRequestPermissionsResult(requestCode)
}
}

By passing in the fragment instance, the controller will use the fragment lifecycle to avoid memory leaks, so that there's no need to unbind.

RecorderFragment

The RecorderFragment is a fragment implemented exactly as described above. It is the recommended implementation as it is very easy to use - no need to release or bind UI, because the fragment owns the views.

You can customize the fragment after it is attached or when creating it, thanks to the RecorderOptions class:

val options = RecorderOptions.build {
overlay(R.layout.custom_controls)
facing(CameraFacing.FRONT)
flash(CameraFlash.OFF)
upload(UploadRequest(title = "Video Title"))
saveToGallery(true)
writeClips(false)
maxDuration(30000L)
}
val recorder = RecorderFragment.newInstance(options)

RecorderView

The RecorderView is a view that holds a controller, to be used for codebases that do not use fragments at all. Just like the controller, you must pass a fragment / activity / lifecycle with bind() to use it.

class RecordActivity : AppCompatActivity() {

val recorder by lazy { findViewById<RecorderView>(R.id.recorder) }

override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.recorder_view)
recorder.bind(this) // necessary!
}

override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
super.onActivityResult(requestCode, resultCode, data)
recorder.onActivityResult(requestCode, resultCode, data)
}

override fun onRequestPermissionsResult(requestCode: Int, permissions: Array<out String>, grantResults: IntArray) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults)
recorder.onRequestPermissionsResult(requestCode)
}
}