streamingDataCaptureUpload method

Future<String> streamingDataCaptureUpload(
  1. List<int> bytes,
  2. String partId,
  3. String fileExtension, {
  4. String? componentType,
  5. String? componentName,
  6. String? methodName,
  7. Map<String, Any>? methodParameters,
  8. (DateTime, DateTime)? dataRequestTimes,
  9. Iterable<String> tags = const [],
})

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