Copy #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