Skip to content

Commit f106ddd

Browse files
author
bot-snapenginesc
committed
[All] Sync changes for the 1.38.0 release
1 parent 2c83622 commit f106ddd

36 files changed

+450
-69
lines changed

CHANGELOG.md

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,14 @@ and the Camera Kit SDK adheres to [Semantic Versioning](https://semver.org/spec/
88
<a name="unreleased"></a>
99
## [Unreleased]
1010

11+
<a name="1.38.0"></a>
12+
## [1.38.0] - 2025-02-05
13+
### Features
14+
- Lens Studio 5.6 support
15+
16+
### Updates
17+
- Addition of Jetpack compose basic sample app
18+
1119
<a name="1.37.0"></a>
1220
## [1.37.0] - 2024-12-18
1321
### Features

README.md

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44

55
# Camera Kit for Android
66

7-
[Home Page](https://developers.snap.com/camera-kit/home) | [Documentation & Guides](https://developers.snap.com/camera-kit/getting-started/what-is-camera-kit) | [Showcase](https://ar.snap.com/camera-kit) | [API Reference](https://kit.snapchat.com/reference/CameraKit/android/1.37.0/index.html) | [Developer Portal](https://kit.snapchat.com/manage/) | [My Lenses](https://my-lenses.snapchat.com/) | [Discord](https://discord.gg/snapar)
7+
[Home Page](https://developers.snap.com/camera-kit/home) | [Documentation & Guides](https://developers.snap.com/camera-kit/getting-started/what-is-camera-kit) | [Showcase](https://ar.snap.com/camera-kit) | [API Reference](https://kit.snapchat.com/reference/CameraKit/android/1.38.0/index.html) | [Developer Portal](https://kit.snapchat.com/manage/) | [My Lenses](https://my-lenses.snapchat.com/) | [Discord](https://discord.gg/snapar)
88
</div>
99

1010
Camera Kit brings the power of Snap's AR platform to your websites and mobile apps on iOS and Android. It has never been easier to create and deliver scalable, multi-platform AR experiences to meet your customers, wherever they are.
@@ -136,6 +136,8 @@ This project includes several sample apps that demonstrate different approaches
136136

137137
- [`camerakit-sample-basic`](./Samples/camerakit-sample-basic) demonstrates simplest and bare minimum
138138
way to integrate Camera Kit.
139+
- [`camerakit-sample-compose-basic`](./Samples/camerakit-sample-compose-basic) demonstrates simplest and bare minimum
140+
way to integrate Camera Kit via Jetpack Compose.
139141
- [`camerakit-sample-full`](./Samples/camerakit-sample-full) contains a fully functioning camera capture with lenses and preview flow.
140142
- [`camerakit-sample-custom-video`](./Samples/camerakit-sample-custom-video) demonstrates how to set up a custom video/audio encoding and audio source implementation.
141143
- [`camerakit-sample-custom-input`](./Samples/camerakit-sample-custom-input) demonstrates how to setup a custom input to the Camera Kit's processing pipeline.

Samples/build.gradle

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ plugins {
1515
allprojects {
1616
ext {
1717
kotlinVersion = libs.versions.kotlin.get()
18-
ktxVersion = '1.8.0'
18+
ktxVersion = '1.9.0'
1919
exoPlayerVersion = '2.16.1'
2020
appCompatVersion = '1.4.0'
2121
constraintLayoutVersion = '2.1.2'
@@ -24,6 +24,10 @@ allprojects {
2424
drawerLayoutVersion = '1.1.1'
2525
glideVersion = '4.11.0'
2626
gmsVisionVersion = '16.2.0'
27+
composeBomVersion = '2023.08.00'
28+
accompistPermissionsVersion = '0.32.0'
29+
activityComposeVersion = '1.9.3'
30+
activityKtxVersion = '1.3.3'
2731

2832
androidMinSdkVersion = 21
2933
androidCompileSdkVersion = 34

Samples/camerakit-sample-basic/src/main/AndroidManifest.xml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,10 @@
33
xmlns:tools="http://schemas.android.com/tools"
44
package="com.snap.camerakit.sample.basic">
55

6+
<uses-feature
7+
android:name="android.hardware.camera"
8+
android:required="false" />
9+
610
<uses-permission android:name="android.permission.INTERNET" />
711
<uses-permission android:name="android.permission.CAMERA" />
812

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
/build
Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
plugins {
2+
id 'com.android.application'
3+
id 'org.jetbrains.kotlin.android'
4+
}
5+
6+
android {
7+
namespace 'com.example.camerakit.sample.compose'
8+
compileSdkVersion androidCompileSdkVersion
9+
10+
defaultConfig {
11+
applicationId "com.example.camerakit.sample.compose.basic"
12+
minSdkVersion androidMinSdkVersion
13+
targetSdkVersion androidTargetSdkVersion
14+
versionCode cameraKitDistributionCode
15+
versionName cameraKitDistributionVersion
16+
}
17+
18+
buildTypes {
19+
release {
20+
minifyEnabled false
21+
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
22+
}
23+
}
24+
25+
compileOptions {
26+
sourceCompatibility JavaVersion.VERSION_1_8
27+
targetCompatibility JavaVersion.VERSION_1_8
28+
}
29+
kotlinOptions {
30+
jvmTarget = '1.8'
31+
}
32+
buildFeatures {
33+
compose true
34+
}
35+
composeOptions {
36+
kotlinCompilerExtensionVersion '1.5.1'
37+
}
38+
packagingOptions {
39+
resources {
40+
excludes += '/META-INF/{AL2.0,LGPL2.1}'
41+
}
42+
}
43+
}
44+
45+
dependencies {
46+
implementation "androidx.core:core-ktx:$ktxVersion"
47+
implementation platform("androidx.compose:compose-bom:$composeBomVersion")
48+
implementation 'androidx.compose.ui:ui'
49+
implementation 'androidx.compose.ui:ui-graphics'
50+
implementation 'androidx.compose.material3:material3'
51+
implementation "androidx.activity:activity-compose:$activityComposeVersion"
52+
implementation "androidx.appcompat:appcompat:$appCompatVersion"
53+
implementation "androidx.activity:activity-ktx:$activityKtxVersion"
54+
implementation "com.google.accompanist:accompanist-permissions:$accompistPermissionsVersion"
55+
implementation "com.snap.camerakit:camerakit:$cameraKitVersion"
56+
implementation "com.snap.camerakit:support-camera-layout:$cameraKitVersion"
57+
}
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
<?xml version="1.0" encoding="utf-8"?>
2+
<manifest xmlns:android="http://schemas.android.com/apk/res/android" >
3+
4+
<uses-feature
5+
android:name="android.hardware.camera"
6+
android:required="false" />
7+
8+
<uses-permission android:name="android.permission.CAMERA"/>
9+
10+
<application
11+
android:allowBackup="true"
12+
android:icon="@mipmap/ic_launcher"
13+
android:label="@string/app_name"
14+
android:roundIcon="@mipmap/ic_launcher_round"
15+
android:supportsRtl="true"
16+
android:theme="@style/Theme.AppCompat" >
17+
18+
<meta-data
19+
android:name="com.snap.camerakit.api.token"
20+
android:value="REPLACE-THIS-WITH-YOUR-OWN-APP-SPECIFIC-VALUE"/>
21+
22+
<activity
23+
android:name=".MainActivity"
24+
android:exported="true"
25+
android:label="@string/app_name"
26+
android:theme="@style/Theme.AppCompat.DayNight.NoActionBar">
27+
<intent-filter>
28+
<action android:name="android.intent.action.MAIN" />
29+
30+
<category android:name="android.intent.category.LAUNCHER" />
31+
</intent-filter>
32+
33+
</activity>
34+
</application>
35+
36+
</manifest>
Lines changed: 103 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,103 @@
1+
package com.example.camerakit.sample.compose
2+
3+
import android.Manifest
4+
import android.os.Bundle
5+
import android.view.LayoutInflater
6+
import android.view.ViewStub
7+
import android.widget.Toast
8+
import androidx.activity.compose.setContent
9+
import androidx.activity.enableEdgeToEdge
10+
import androidx.appcompat.app.AppCompatActivity
11+
import androidx.compose.runtime.Composable
12+
import androidx.compose.runtime.LaunchedEffect
13+
import androidx.compose.ui.viewinterop.AndroidView
14+
import com.google.accompanist.permissions.ExperimentalPermissionsApi
15+
import com.google.accompanist.permissions.isGranted
16+
import com.google.accompanist.permissions.rememberPermissionState
17+
import com.google.accompanist.permissions.shouldShowRationale
18+
import com.snap.camerakit.Session
19+
import com.snap.camerakit.invoke
20+
import com.snap.camerakit.lenses.LensesComponent
21+
import com.snap.camerakit.lenses.whenHasFirst
22+
import com.snap.camerakit.support.camerax.CameraXImageProcessorSource
23+
import com.snap.camerakit.supported
24+
25+
/**
26+
* A bare minimum Camera Kit app, using Jetpack Compose, which simply applies 1 Lens in full screen. You should add error handling and UI
27+
* components as needed.
28+
*/
29+
class MainActivity : AppCompatActivity() {
30+
31+
private var cameraKitSession: Session? = null
32+
private lateinit var imageProcessorSource: CameraXImageProcessorSource
33+
companion object {
34+
const val LENS_GROUP_ID = "REPLACE-THIS-WITH-YOUR-OWN-APP-SPECIFIC-VALUE"
35+
const val LENS_ID = "REPLACE-THIS-WITH-YOUR-OWN-APP-SPECIFIC-VALUE"
36+
}
37+
38+
override fun onCreate(savedInstanceState: Bundle?) {
39+
enableEdgeToEdge()
40+
super.onCreate(savedInstanceState)
41+
42+
if (!supported(this)) {
43+
Toast.makeText(this, R.string.camera_kit_not_supported, Toast.LENGTH_SHORT).show()
44+
finish()
45+
return
46+
}
47+
48+
imageProcessorSource = CameraXImageProcessorSource(context = this, lifecycleOwner = this)
49+
50+
setContent {
51+
CameraPreview(onCameraPermissionDenied = {
52+
Toast.makeText(this, R.string.camera_permission_not_granted, Toast.LENGTH_SHORT).show()
53+
finish()
54+
})
55+
}
56+
}
57+
58+
@OptIn(ExperimentalPermissionsApi::class)
59+
@Composable
60+
fun CameraPreview(onCameraPermissionDenied: () -> Unit) {
61+
val cameraPermissionState = rememberPermissionState(
62+
Manifest.permission.CAMERA
63+
)
64+
65+
if (!cameraPermissionState.status.isGranted) {
66+
if (cameraPermissionState.status.shouldShowRationale) {
67+
onCameraPermissionDenied()
68+
} else {
69+
LaunchedEffect(Unit) {
70+
cameraPermissionState.launchPermissionRequest()
71+
}
72+
}
73+
} else {
74+
imageProcessorSource.startPreview(false)
75+
76+
AndroidView(
77+
factory = { ctx ->
78+
LayoutInflater.from(ctx).inflate(R.layout.camera_layout, null).apply {
79+
val viewStub = findViewById<ViewStub>(R.id.camera_kit_stub)
80+
81+
cameraKitSession = Session(context = ctx) {
82+
imageProcessorSource(imageProcessorSource)
83+
attachTo(viewStub)
84+
}.apply {
85+
lenses.repository.observe(
86+
LensesComponent.Repository.QueryCriteria.ById(LENS_ID, LENS_GROUP_ID)
87+
) { result ->
88+
result.whenHasFirst { requestedLens ->
89+
lenses.processor.apply(requestedLens)
90+
}
91+
}
92+
}
93+
}
94+
}
95+
)
96+
}
97+
}
98+
99+
override fun onDestroy() {
100+
cameraKitSession?.close()
101+
super.onDestroy()
102+
}
103+
}

0 commit comments

Comments
 (0)