Kotlin & Java Support
Add Turbina to your app's build.gradle:
dependencies {
implementation 'com.turbina:sdk:1.0.0'
// Required dependencies
implementation 'androidx.camera:camera-core:1.3.0'
implementation 'androidx.camera:camera-camera2:1.3.0'
implementation 'androidx.camera:camera-lifecycle:1.3.0'
implementation 'androidx.camera:camera-view:1.3.0'
}Add the Turbina repository in your project's build.gradle:
allprojects {
repositories {
google()
mavenCentral()
maven { url 'https://maven.turbina.io' }
}
}import com.turbina.sdk.TurbinaSDK
import com.turbina.sdk.TurbinaConfig
class MainActivity : AppCompatActivity() {
private lateinit var turbina: TurbinaSDK
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
setupTurbina()
}
private fun setupTurbina() {
val config = TurbinaConfig.Builder()
.licenseKey("trb_live_sk_your_license_key")
.appId(BuildConfig.APPLICATION_ID)
.build()
turbina = TurbinaSDK(this, config)
turbina.initialize { result ->
when (result) {
is TurbinaResult.Success -> {
Log.d("Turbina", "Initialized: ${result.data.tier}")
Log.d("Turbina", "Features: ${result.data.features}")
}
is TurbinaResult.Error -> {
Log.e("Turbina", "Init failed: ${result.error}")
}
}
}
}
}import androidx.camera.view.PreviewView
class CameraActivity : AppCompatActivity() {
private lateinit var turbina: TurbinaSDK
private lateinit var previewView: PreviewView
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_camera)
previewView = findViewById(R.id.previewView)
setupCamera()
}
private fun setupCamera() {
turbina.attachPreview(previewView) { result ->
when (result) {
is TurbinaResult.Success -> {
Log.d("Camera", "Preview started")
applyEffects()
}
is TurbinaResult.Error -> {
Log.e("Camera", "Preview failed: ${result.error}")
}
}
}
}
private fun applyEffects() {
// Enable face tracking
turbina.enableFaceTracking()
// Apply beautification
turbina.applyFaceEffect(
effect = FaceEffect.SMOOTH_SKIN,
intensity = 0.7f
)
// Apply video filter
turbina.applyFilter(VideoFilter.VINTAGE) { result ->
when (result) {
is TurbinaResult.Success -> {
Log.d("Filter", "Applied successfully")
}
is TurbinaResult.Error -> {
Log.e("Filter", "Failed: ${result.error}")
}
}
}
}
}class RecordingActivity : AppCompatActivity() {
private lateinit var turbina: TurbinaSDK
private var isRecording = false
fun startRecording() {
turbina.startRecording(
outputFile = File(getExternalFilesDir(null), "video_${System.currentTimeMillis()}.mp4"),
config = RecordingConfig.Builder()
.resolution(Resolution.HD_1920x1080)
.fps(30)
.bitrate(8_000_000)
.build()
) { result ->
when (result) {
is TurbinaResult.Success -> {
isRecording = true
Log.d("Recording", "Started")
}
is TurbinaResult.Error -> {
Log.e("Recording", "Failed to start: ${result.error}")
}
}
}
}
fun stopRecording() {
if (!isRecording) return
turbina.stopRecording { result ->
when (result) {
is TurbinaResult.Success -> {
isRecording = false
val videoPath = result.data.path
Log.d("Recording", "Saved to: $videoPath")
// Show video or save to gallery
saveToGallery(videoPath)
}
is TurbinaResult.Error -> {
Log.e("Recording", "Failed to save: ${result.error}")
}
}
}
}
private fun saveToGallery(path: String) {
// Save to MediaStore
MediaScannerConnection.scanFile(
this,
arrayOf(path),
arrayOf("video/mp4"),
null
)
}
}import com.turbina.sdk.TurbinaSDK;
import com.turbina.sdk.TurbinaConfig;
import com.turbina.sdk.TurbinaCallback;
public class MainActivity extends AppCompatActivity {
private TurbinaSDK turbina;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
setupTurbina();
}
private void setupTurbina() {
TurbinaConfig config = new TurbinaConfig.Builder()
.licenseKey("trb_live_sk_your_license_key")
.appId(BuildConfig.APPLICATION_ID)
.build();
turbina = new TurbinaSDK(this, config);
turbina.initialize(new TurbinaCallback<InitResult>() {
@Override
public void onSuccess(InitResult result) {
Log.d("Turbina", "Initialized: " + result.getTier());
}
@Override
public void onError(TurbinaException error) {
Log.e("Turbina", "Init failed: " + error.getMessage());
}
});
}
private void applyEffects() {
turbina.applyFilter(VideoFilter.VINTAGE, new TurbinaCallback<Void>() {
@Override
public void onSuccess(Void result) {
Log.d("Filter", "Applied successfully");
}
@Override
public void onError(TurbinaException error) {
Log.e("Filter", "Failed: " + error.getMessage());
}
});
}
}Add these permissions to your AndroidManifest.xml:
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-feature android:name="android.hardware.camera" android:required="true" />
<uses-feature android:name="android.hardware.camera.autofocus" android:required="false" />Don't forget to request runtime permissions:
private fun requestPermissions() {
ActivityCompat.requestPermissions(
this,
arrayOf(
Manifest.permission.CAMERA,
Manifest.permission.RECORD_AUDIO,
Manifest.permission.WRITE_EXTERNAL_STORAGE
),
PERMISSION_REQUEST_CODE
)
}
companion object {
private const val PERMISSION_REQUEST_CODE = 100
}Add these rules to your proguard-rules.pro:
# Turbina SDK
-keep class com.turbina.sdk.** { *; }
-keep interface com.turbina.sdk.** { *; }
-dontwarn com.turbina.sdk.**You're ready to build! Check out these resources: