Configuration
Initialize the SDK with your API credentials.
1import KinesteXAIKit
2
3@State var showKinesteX = false // Controls KinesteX SDK visibility
4@State var isLoading = false // Optional: Controls custom loading screen
5
6// Initialize with your API key, company name, and unique user ID
7let kinestex = KinesteXAIKit(
8 apiKey: "YOUR_API_KEY",
9 companyName: "YOUR_COMPANY",
10 userId: "unique-user-id"
11)
12
13// Optional: UserDetails to customize workout intensity
14let user = UserDetails(
15 age: 20,
16 height: 170,
17 weight: 70,
18 gender: .Male,
19 lifestyle: .Active
20)Step 2: Register Application Class
Register your custom Application class in AndroidManifest.xml:
AndroidManifest.xml
<application
android:name=".MyApplication"
...>
</application>Step 3: Request Camera Permission
Before a user starts a workout, request camera permission at the app level. Your activity or fragment must implement the PermissionHandler interface:
MainActivity with PermissionHandler
class MainActivity : AppCompatActivity(), PermissionHandler {
// Initialize the webview
private var kinesteXWebView: GenericWebView? = null
// Optional: Pass user details to adjust exercises and estimate calories
// Note: User details are only used on the device for customization during the session
private var userDetails = UserDetails(
age = 20,
height = 170,
weight = 180,
gender = Gender.MALE,
lifestyle = Lifestyle.ACTIVE
)
// Register permission launcher
private val requestPermissionLauncher = registerForActivityResult(
ActivityResultContracts.RequestPermission()
) { isGranted: Boolean ->
// Pass permission result to KinesteX webview
kinesteXWebView?.handlePermissionResult(isGranted)
}
// Override to display system dialog for camera access
override fun requestCameraPermission() {
requestPermissionLauncher.launch(Manifest.permission.CAMERA)
}
}Step 4: Handle SDK Messages
Implement a callback function to handle messages from the SDK:
Message Handler
private fun handleWebViewMessage(message: WebViewMessage) {
when (message) {
is WebViewMessage.ExitKinestex -> {
// Dismiss KinesteX view when user clicks exit button
}
// Handle other messages
else -> {
Log.d("KinesteX", message.toString())
}
}
}Step 2: Request Camera Permission
Request camera permission before launching KinesteX. Ensure you've added the necessary permissions in AndroidManifest.xml and Info.plist. Add the following to your iOS Podfile:
2.1: ios/Podfile
post_install do |installer|
installer.pods_project.targets.each do |target|
flutter_additional_ios_build_settings(target)
target.build_configurations.each do |config|
config.build_settings['GCC_PREPROCESSOR_DEFINITIONS'] ||= [
'$(inherited)',
## dart: PermissionGroup.camera
'PERMISSION_CAMERA=1',
]
end
end
end2.2: Request Permission in Dart
void _checkCameraPermission() async {
if (await Permission.camera.request() != PermissionStatus.granted) {
_showCameraAccessDeniedAlert();
}
}
void _showCameraAccessDeniedAlert() {
showDialog(
context: context,
builder: (BuildContext context) {
return AlertDialog(
title: const Text("Camera Permission Denied"),
content: const Text("Camera access is required for this app to function properly."),
actions: <Widget>[
TextButton(
child: const Text("OK"),
onPressed: () {
Navigator.of(context).pop();
},
),
],
);
},
);
}Step 3: Initialize on App Launch
Initialize KinesteX in your main function for WebView warmup:
main.dart
Future<void> main() async {
await KinesteXAIFramework.initialize(
apiKey: YOUR_API_KEY,
companyName: YOUR_COMPANY_NAME,
userId: YOUR_USER_ID,
);
runApp(
const MaterialApp(
home: MyHomePage(),
),
);
}Step 4: Deinitialize on App Closure
Call dispose when closing the app:
Dispose Method
@override
void dispose() {
disposeKinesteXAIFramework();
super.dispose();
}Step 5: Setup Recommendations
Use a ValueNotifier to manage KinesteX presentation and handle callback messages:
State Management & Message Handler
import 'package:kinestex_sdk_flutter/kinestex_sdk.dart';
// Add a ValueNotifier to manage presentation
ValueNotifier<bool> showKinesteX = ValueNotifier<bool>(false);
// Handle callback messages from KinesteX
void handleWebViewMessage(WebViewMessage message) {
if (message is ExitKinestex) {
setState(() {
showKinesteX.value = false;
});
} else {
print("Message received: ${message.data}");
}
}