Upload Media

This documentation provides guidelines on uploading images and video to server using the TruVideo Media SDK. The SDK offers simple methods to integrate upload functionalities into your application.

Prerequisites

  • Ensure you have integrated the TruVideo Core SDK into your project and completed with the authentication process

  • Camera module will provide MediaItem or simply provide filepath to upload (optional)

Step 1 : Import Classes

#if IOS
using UIKit;
using Foundation;
using TruvideoMediaiOS;
#endif

#if ANDROID
using Application = Android.App.Application;
using TruVideoMediaAndroidBinding;
using JsonSerializer = System.Text.Json.JsonSerializer;
using TruVideoMediaLib = TruVideoMediaAndroid.DotnetTruvideoMedia;
#endif

Step 2 : Create Async Callback Wrapper

#if ANDROID
private Task<T> ExecuteMediaCallbackAsync<T>(Action<MediaCallback> action)
{
    var tcs = new TaskCompletionSource<T>();

    action.Invoke(new MediaCallback(
        success => MainThread.BeginInvokeOnMainThread(() =>
            tcs.TrySetResult((T)Convert.ChangeType(success, typeof(T)))),
        failure => MainThread.BeginInvokeOnMainThread(() => tcs.TrySetException(new Exception(failure)))
    ));

    return tcs.Task;
}
#endif

#if IOS
private Task<T> ExecuteCallbackAsync<T>(Action<Action<string, NSError>> nativeCall) {
    var tcs = new TaskCompletionSource<T>();
    nativeCall((nsResult, error) => {
        if (error != null)
        {
            tcs.SetException(new Exception(error.LocalizedDescription));
        }
        else {
            // Convert NSString to string
            string result = nsResult.ToString();
            tcs.TrySetResult((T)Convert.ChangeType(result, typeof(T)));
           // tcs.SetResult(result);
        }
    });
    return tcs.Task;
}
#endif

Step 3 : Crete TruvideoMediaUploadHandler class to get the callback for iOS specific and Initialise it

using System;
using Foundation;
using TruvideoMediaiOS;
using UIKit;
using TruVideoSampleIOSApp;

public class TruvideoMediaUploadHandler : TruvideoMediaUploadDelegate
{
    private readonly MainPage _mainPage;

    public TruvideoMediaUploadHandler(MainPage mainPage)
    {
        _mainPage = mainPage;
    }

    [Export("uploadProgressWithUpdated:")]
    public void UploadProgress(double updated)
    {
        MainThread.BeginInvokeOnMainThread(() =>
        {
            var percentage = Math.Round(updated);
            _mainPage.UpdateProgress($"Upload progress: {percentage}%");
        });
    }
}

// initalize TruvideoMediaUploadHandler
private TruvideoMediaUploadHandler _uploadHandler;

public MainPage(){
    _uploadHandler = new TruvideoMediaUploadHandler(this);
    TruvideoMedia.Shared.Delegate = _uploadHandler;
}

Step 4 : Set tags or metaData mediaBuilder object if required

var tags = new Tags()
                .Set("key", "value")
                .Set("color", "red")
                .Set("order-number", "123")
                .Build();
var metadata = new MediaMetadata()
                .Set("key", "value")
                .Set("list", new List<string> { "value1", "value2" })
                .Set("nested", new MediaMetadata()
                                .Set("key", "value")
                                .Set("list", new List<string> { "value1", "value2" })
                                .Build())
                .Build();
// create string format
var tagsString = JsonSerializer.Serialize(tags);
var metadataString = JsonSerializer.Serialize(metadata);

Step 5 : Call UploadMedia Function

#if ANDROID
if (_initAuthResult.Equals("Init Authentication Success"))
{
    var mediaResult = await ExecuteMediaCallbackAsync<string>(cb => TruVideoMediaLib.UploadMedia(Application.Context, tagsString, metadataString, _cameraList, cb));
    LogTextEditor.Text = "Uploaded media URL:\n" + mediaResult + "\n";
}
else
{
    await DisplayAlert("TruVideo", "Please authentication first", "OK");
}
#elif IOS
if (_selectedMedia.Count > 0)
{
    void UploadMediaHandler(MediaResponse response, NSError error)
    {
        MainThread.BeginInvokeOnMainThread(() =>
        {
            if (error != null)
            LogTextEditor.Text = "Upload failed: " + error.LocalizedDescription + "\n";
            else
            LogTextEditor.Text = "Uploaded media URL:\n" + response.UploadedFileURL.AbsoluteString + "\n" +
            "Uploaded media tags:\n" + response.UploadedFileURL.AbsoluteString + "\n" +
            "Uploaded media metaData:\n" + response.Tags + "\n" + response.Metadata +
            "\n" + "Uploaded media type:\n" + response.Type + "\n";
        });
    }
    TruvideoMedia.Shared.UploadMedia(_selectedMedia[0], tagsString, metadataString, UploadMediaHandler);
}
else
{
    LogTextEditor.Text += "No selected media from camera\n";
}
#endif
} 

Step 6 : Create Listener for event

#if ANDROID
private void subscribeToMediaEvents()
{
    var nativeService = new TruVideoMediaLib();
    var listener = new DataListener();
    // Subscribe to the event
    listener.DataReceived += data =>
        {
            MainThread.BeginInvokeOnMainThread(() =>
        {
            Console.WriteLine($"Received Data: {data}");
        });
    };
    nativeService.SetDataListener(listener);
}
#endif

Finalize :

After completing this steps the function should look like

#if IOS
using UIKit;
using Foundation;
using TruvideoMediaiOS;
#endif

#if ANDROID
using Application = Android.App.Application;
using TruVideoMediaAndroidBinding;
using JsonSerializer = System.Text.Json.JsonSerializer;
using TruVideoMediaLib = TruVideoMediaAndroid.DotnetTruvideoMedia;
#endif

#if ANDROID
private Task<T> ExecuteMediaCallbackAsync<T>(Action<MediaCallback> action)
{
    var tcs = new TaskCompletionSource<T>();

    action.Invoke(new MediaCallback(
        success => MainThread.BeginInvokeOnMainThread(() =>
            tcs.TrySetResult((T)Convert.ChangeType(success, typeof(T)))),
        failure => MainThread.BeginInvokeOnMainThread(() => tcs.TrySetException(new Exception(failure)))
    ));

    return tcs.Task;
}
#endif

#if IOS
private Task<T> ExecuteCallbackAsync<T>(Action<Action<string, NSError>> nativeCall) {
    var tcs = new TaskCompletionSource<T>();
    nativeCall((nsResult, error) => {
        if (error != null)
        {
            tcs.SetException(new Exception(error.LocalizedDescription));
        }
        else {
            // Convert NSString to string
            string result = nsResult.ToString();
            tcs.TrySetResult((T)Convert.ChangeType(result, typeof(T)));
           // tcs.SetResult(result);
        }
    });
    return tcs.Task;
}
#endif


private TruvideoMediaUploadHandler _uploadHandler;

public MainPage(){
    _uploadHandler = new TruvideoMediaUploadHandler(this);
    TruvideoMedia.Shared.Delegate = _uploadHandler;
}


private async void UploadMedia()
{
var tags = new Tags()
                .Set("key", "value")
                .Set("color", "red")
                .Set("order-number", "123")
                .Build();
var metadata = new MediaMetadata()
                .Set("key", "value")
                .Set("list", new List<string> { "value1", "value2" })
                .Set("nested", new MediaMetadata()
                .Set("key", "value")
                .Set("list", new List<string> { "value1", "value2" })
                .Build())
                .Build();
var tagsString = JsonSerializer.Serialize(tags);
var metadataString = JsonSerializer.Serialize(metadata);
LogTextEditor.Text = "Uploading ....\n";
#if ANDROID
if (_initAuthResult.Equals("Init Authentication Success"))
{
    var mediaResult = await ExecuteMediaCallbackAsync<string>(cb => TruVideoMediaLib.UploadMedia(Application.Context, tagsString, metadataString, _cameraList, cb));
    LogTextEditor.Text = "Uploaded media URL:\n" + mediaResult + "\n";
}
else
{
    await DisplayAlert("TruVideo", "Please authentication first", "OK");
}
#elif IOS
if (_selectedMedia.Count > 0)
{
    void UploadMediaHandler(MediaResponse response, NSError error)
    {
        MainThread.BeginInvokeOnMainThread(() =>
        {
            if (error != null)
            LogTextEditor.Text = "Upload failed: " + error.LocalizedDescription + "\n";
            else
            LogTextEditor.Text = "Uploaded media URL:\n" + response.UploadedFileURL.AbsoluteString + "\n" +
            "Uploaded media tags:\n" + response.UploadedFileURL.AbsoluteString + "\n" +
            "Uploaded media metaData:\n" + response.Tags + "\n" + response.Metadata +
            "\n" + "Uploaded media type:\n" + response.Type + "\n";
        });
    }
    TruvideoMedia.Shared.UploadMedia(_selectedMedia[0], tagsString, metadataString, UploadMediaHandler);
}
else
{
    LogTextEditor.Text += "No selected media from camera\n";
}
#endif
} 


#if ANDROID
private void subscribeToMediaEvents()
{
    var nativeService = new TruVideoMediaLib();
    var listener = new DataListener();
    // Subscribe to the event
    listener.DataReceived += data =>
        {
            MainThread.BeginInvokeOnMainThread(() =>
        {
            Console.WriteLine($"Received Data: {data}");
        });
    };
    nativeService.SetDataListener(listener);
}
#endif

Last updated

Was this helpful?