private async Task <StorageFile?> PickSaveFileTaskAsync(CancellationToken token) { if (!(ContextHelper.Current is Activity appActivity)) { throw new InvalidOperationException("Application activity is not yet set, API called too early."); } var action = Intent.ActionCreateDocument; var intent = new Intent(action); intent.SetType("*/*"); intent.AddCategory(Intent.CategoryOpenable); var mimeTypes = GetMimeTypes(); this.ParseMimeTypeForXml(mimeTypes); foreach (var mime in mimeTypes) { intent.PutExtra(Intent.ExtraMimeTypes, mime); } if (!string.IsNullOrEmpty(SuggestedFileName)) { intent.PutExtra(Intent.ExtraTitle, SuggestedFileName); } var activity = await AwaitableResultActivity.StartAsync(); var result = await activity.StartActivityForResultAsync(intent, cacellationToken : token); var resultIntent = result?.Intent; if (resultIntent?.Data != null) { return(StorageFile.GetFromSafUri(resultIntent.Data)); } else if (resultIntent?.ClipData != null && resultIntent.ClipData.ItemCount > 0) { for (int itemIndex = 0; itemIndex < resultIntent.ClipData.ItemCount; itemIndex++) { var uri = resultIntent.ClipData.GetItemAt(itemIndex)?.Uri; if (uri != null) { return(StorageFile.GetFromSafUri(uri)); } } } return(null); }
private static async Task <ComponentName> ResolveEmailComponent() { var packageManager = Application.Context.PackageManager; var emailDummyIntent = new Intent(Intent.ActionSendto); emailDummyIntent.SetData(Android.Net.Uri.Parse("mailto:[email protected]")); var emailActivities = packageManager.QueryIntentActivities(emailDummyIntent, 0); if (emailActivities == null) { return(null); } if (emailActivities.Count == 1) { return(GetComponentName(emailActivities[0])); } var defaultHandler = emailActivities.FirstOrDefault(e => e.IsDefault); if (defaultHandler != null) { return(GetComponentName(defaultHandler)); } var intentPick = new Intent(); intentPick.SetAction(Intent.ActionPickActivity); intentPick.PutExtra(Intent.ExtraIntent, emailDummyIntent); var awaitableResultActivity = await AwaitableResultActivity.StartAsync(); var result = await awaitableResultActivity.StartActivityForResultAsync(intentPick, HandlerPickerResultCode); if (result.Result == Result.Ok) { return(result.Intent.Component); } return(null); }