Minfo_sdk
Multi-platform SDK for AudioQR-powered engagement. Connect users to campaigns via inaudible audio watermarks embedded in TV, radio, cinema, and physical spaces.
1. Features
The SDK handles the complete AudioQR "connection" process:
- Activation: The SDK activates the microphone and listens for audible signals (TV/Radio).
- Decoding: The Cifrasoft engine processes the signal in real-time.
- Resolution: The SDK queries Minfo servers to retrieve the associated campaign data.
- Control: You manage your own UI and user experience.
2. Step-by-Step Implementation
Flutter (Your Platform)
-
Add the SDK as a local dependency in
pubspec.yaml -
Configurations:
Android - configured in your
AndroidManifest.xml:<uses-permission android:name="android.permission.RECORD_AUDIO" /> <uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" /> <uses-permission android:name="android.permission.READ_PHONE_STATE" /> <uses-permission android:name="android.permission.INTERNET" />iOS - configured in your
Info.plist:<key>NSMicrophoneUsageDescription</key> <string>We need microphone access to detect AudioQR signals.</string> -
Install dependencies:
flutter pub get -
Initialize in
main.dart:import 'package:minfo_sdk/minfo_sdk.dart'; void main() async { WidgetsFlutterBinding.ensureInitialized(); await MinfoSdk.initialize(publicApiKey: 'your_public_key', privateApiKey: 'your_private_key'); runApp(MyApp()); } -
Listen for campaigns:
// Start Scanning: The startScan method automatically handles runtime permission requests for both iOS and Android.
MinfoSdk.instance.startScan(
onResult: (result) {
print('Detected: ${result.name}');
// result contains all campaign info (image, url, colors, etc.)
},
onError: (error) {
print('Error: $error');
},
);
//Stop Scanning
await MinfoSdk.instance.stop();
3. Campaign Data Structure
When a campaign is detected, you receive a CampaignResult object with:
class CampaignResult {
final int audioId; // Detected audio ID
final String? campaignUrl; // Campaign URL
final String? name; // Campaign name
final String? campaignDescription; // Campaign description
final String? image; // Campaign image URL
final Map<String, dynamic>? campaignData; // Full campaign data
final Map<String, dynamic>? metadata; // Additional metadata
final DateTime timestamp; // Detection timestamp
final String? error; // Error message if any
bool get isSuccess; // True if campaign found
bool get hasError; // True if error occurred
// Note: Additional fields may be available but not documented here
// Check the actual implementation for complete field list
}
4. Architecture Overview
The SDK relies on communication between Flutter and native engines:
- Flutter requests startup with
startScan() - Native Engines analyze audio stream
- Minfo API validates signal and returns campaign data
- Your App receives
CampaignResultvia stream and handles UI
5. Complete Example
A complete implementation example with state management and UI is available in the /example folder of this repository.
6. License
This SDK uses proprietary Cifrasoft libraries. See the LICENSE file for more details.