Back to Documentation

Android SDK Guide

Kotlin & Java Support

Requirements

  • • Android 7.0 (API level 24) or higher
  • • Android Studio Arctic Fox or later
  • • Kotlin 1.7+ or Java 8+
  • • Valid Turbina license key

Installation

Using Gradle

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' }
    }
}

Kotlin Implementation

1. Initialize SDK

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}")
                }
            }
        }
    }
}

2. Camera Preview with Effects

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}")
                }
            }
        }
    }
}

3. Video Recording

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
        )
    }
}

Java Implementation

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());
            }
        });
    }
}

Required Permissions

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
}

ProGuard Rules

Add these rules to your proguard-rules.pro:

# Turbina SDK
-keep class com.turbina.sdk.** { *; }
-keep interface com.turbina.sdk.** { *; }
-dontwarn com.turbina.sdk.**