Reputation: 17
I'm trying to download an image from a remote public Mega folder to an Android device using the Mega API in .NET MAUI.
This is the code:
namespace Junior_Jobs;
using Google.Apis.Auth.OAuth2;
using Google.Apis.Drive.v3;
using Google.Apis.Services;
using CG.Web.MegaApiClient;
using Microsoft.Maui.Controls.PlatformConfiguration;
using Android.OS;
using System;
public partial class Tryimportimage : ContentPage
{
public Tryimportimage()
{
InitializeComponent();
MegaApiClient client = new MegaApiClient();
client.LoginAnonymous();
Uri fileLink = new Uri("https://mega.nz/file/W0UAgJaK#XOYyTETrIy8daz3_dw3fdh6Hh8EFEdrnbyoop1r9R6g");
INode node = client.GetNodeFromLink(fileLink);
System.Diagnostics.Debug.WriteLine($"Downloading {node.Name}");
client.DownloadFileAsync(fileLink, Path.Combine("/storage/emulated/0/Downloads",node.Name));
client.Logout();
}
}
I don't get any errors at the moment, but the code doesn't do anything either.
Upvotes: 0
Views: 1166
Reputation: 8883
First of all, you should neither execute asynchronous code nor do any heavy lifting inside of constructors.
Secondly, you should await
the DownloadFileAsync()
method:
await client.DownloadFileAsync(fileLink, Path.Combine("/storage/emulated/0/Downloads",node.Name));
Since this cannot be done inside the constructor, because constructors in C# cannot be asynchronous, you'll have to move the code into an async
method instead:
namespace Junior_Jobs;
using Google.Apis.Auth.OAuth2;
using Google.Apis.Drive.v3;
using Google.Apis.Services;
using CG.Web.MegaApiClient;
using Microsoft.Maui.Controls.PlatformConfiguration;
using Android.OS;
using System;
using System.Threading.Tasks;
public partial class Tryimportimage : ContentPage
{
public Tryimportimage()
{
InitializeComponent();
}
public async Task DownloadAsync()
{
MegaApiClient client = new MegaApiClient();
client.LoginAnonymous();
Uri fileLink = new Uri("https://mega.nz/file/W0UAgJaK#XOYyTETrIy8daz3_dw3fdh6Hh8EFEdrnbyoop1r9R6g");
INode node = client.GetNodeFromLink(fileLink);
System.Diagnostics.Debug.WriteLine($"Downloading {node.Name}");
await client.DownloadFileAsync(fileLink, Path.Combine("/storage/emulated/0/Downloads",node.Name));
client.Logout();
}
}
Then you can instantiate the Tryimportimage
page and await
the result, e.g. like this, depending on how you create your page:
public async Task OpenImportPageAsync()
{
var page = new Tryimportimage();
await Navigation.PushAsync(page);
await page.DownloadAsync();
}
Finally, downloading files and such should usually be delegated to service classes or ViewModels. It's not a common approach to do this directly in a View's code-behind.
You may want to read about asynchronous programming using the async-await pattern.
Upvotes: 0