streamingDataCaptureUpload method
Uploads the metadata and contents of streaming binary data
Returns the data's file ID.
import 'package:file_picker/file_picker.dart';
import 'dart:typed_data';
Future<Uint8List> pickVideoAsBytes() async {
try {
// Open file picker
FilePickerResult? result = await FilePicker.platform.pickFiles(
type: FileType.video,
allowMultiple: false,
);
if (result == null || result.files.isEmpty) {
throw Exception('No file selected');
}
// For mobile, we get the file path and read it
final String? filePath = result.files.first.path;
if (filePath == null) {
throw Exception('Invalid file path');
}
// Read the file as bytes
final File file = File(filePath);
final Uint8List bytes = await file.readAsBytes();
if (bytes.isEmpty) {
throw Exception('File is empty');
}
print('Successfully read file: ${bytes.length} bytes');
return bytes;
} catch (e, stackTrace) {
print('Error picking video: $e');
print('Stack trace: $stackTrace');
rethrow;
}
}
void _uploadData() async {
_viam = await Viam.withApiKey(
dotenv.env['API_KEY_ID'] ?? '',
dotenv.env['API_KEY'] ?? ''
);
final dataClient = _viam.dataClient;
try {
Uint8List video = await pickVideoAsBytes();
(DateTime, DateTime) dataRequestTimes = (
DateTime(2025, 1, 15, 10, 30), // Start time
DateTime(2025, 1, 15, 14, 45) // End time
);
final fileId = await dataClient.streamingDataCaptureUpload(
video,
"<YOUR-PART-ID>",
".mp4", // Replace with your desired file format
componentType: "rdk:component:camera",
componentName: "camera-1",
dataRequestTimes: dataRequestTimes);
print('Successfully uploaded streaming binary data with fileId: $fileId');
} catch (e) {
print('Error uploading streaming binary data: $e');
}
}
For more information, see Data Client API.
Implementation
Future<String> streamingDataCaptureUpload(List<int> bytes, String partId, String fileExtension,
{String? componentType,
String? componentName,
String? methodName,
Map<String, Any>? methodParameters,
(DateTime, DateTime)? dataRequestTimes,
Iterable<String> tags = const []}) async {
final uploadMetadata = UploadMetadata()
..partId = partId
..componentType = componentType ?? ''
..componentName = componentName ?? ''
..methodName = methodName ?? ''
..type = DataType.DATA_TYPE_BINARY_SENSOR
..tags.addAll(tags);
if (methodParameters != null) uploadMetadata.methodParameters.addAll(methodParameters);
if (fileExtension.isEmpty) {
uploadMetadata.fileExtension = '';
} else if (fileExtension[0] == '.') {
uploadMetadata.fileExtension = fileExtension;
} else {
uploadMetadata.fileExtension = '.$fileExtension';
}
final sensorMetadata = SensorMetadata();
if (dataRequestTimes != null) {
sensorMetadata.timeRequested = Timestamp.fromDateTime(dataRequestTimes.$1);
sensorMetadata.timeReceived = Timestamp.fromDateTime(dataRequestTimes.$2);
}
final metadata = DataCaptureUploadMetadata()
..sensorMetadata = sensorMetadata
..uploadMetadata = uploadMetadata;
final metadataStream = Stream.value(StreamingDataCaptureUploadRequest()..metadata = metadata);
final bytesStream = Stream.value(StreamingDataCaptureUploadRequest()..data = bytes);
final requestStream = StreamGroup.merge([metadataStream, bytesStream]);
final response = await _dataSyncClient.streamingDataCaptureUpload(requestStream);
return response.fileId;
}