public async Task <FileResult> CaptureAsync(MediaPickerOptions options, bool photo) { if (!IsCaptureSupported) { throw new FeatureNotSupportedException(); } await Permissions.EnsureGrantedAsync <Permissions.Camera>(); await Permissions.EnsureGrantedAsync <Permissions.StorageWrite>(); var capturePhotoIntent = new Intent(photo ? MediaStore.ActionImageCapture : MediaStore.ActionVideoCapture); if (!PlatformUtils.IsIntentSupported(capturePhotoIntent)) { throw new FeatureNotSupportedException($"Either there was no camera on the device or '{capturePhotoIntent.Action}' was not added to the <queries> element in the app's manifest file. See more: https://developer.android.com/about/versions/11/privacy/package-visibility"); } capturePhotoIntent.AddFlags(ActivityFlags.GrantReadUriPermission); capturePhotoIntent.AddFlags(ActivityFlags.GrantWriteUriPermission); try { var activity = ActivityStateManager.Default.GetCurrentActivity(true); // Create the temporary file var ext = photo ? FileExtensions.Jpg : FileExtensions.Mp4; var fileName = Guid.NewGuid().ToString("N") + ext; var tmpFile = FileSystemUtils.GetTemporaryFile(Application.Context.CacheDir, fileName); // Set up the content:// uri AndroidUri outputUri = null; void OnCreate(Intent intent) { // Android requires that using a file provider to get a content:// uri for a file to be called // from within the context of the actual activity which may share that uri with another intent // it launches. outputUri ??= FileProvider.GetUriForFile(tmpFile); intent.PutExtra(MediaStore.ExtraOutput, outputUri); } // Start the capture process await IntermediateActivity.StartAsync(capturePhotoIntent, PlatformUtils.requestCodeMediaCapture, OnCreate); // Return the file that we just captured return(new FileResult(tmpFile.AbsolutePath)); } catch (OperationCanceledException) { return(null); } }
public async Task <WebAuthenticatorResult> AuthenticateAsync(WebAuthenticatorOptions webAuthenticatorOptions) { var url = webAuthenticatorOptions?.Url; var callbackUrl = webAuthenticatorOptions?.CallbackUrl; var packageName = Application.Context.PackageName; // Create an intent to see if the app developer wired up the callback activity correctly var intent = new Intent(Intent.ActionView); intent.AddCategory(Intent.CategoryBrowsable); intent.AddCategory(Intent.CategoryDefault); intent.SetPackage(packageName); intent.SetData(global::Android.Net.Uri.Parse(callbackUrl.OriginalString)); // Try to find the activity for the callback intent if (!PlatformUtils.IsIntentSupported(intent, packageName)) { throw new InvalidOperationException($"You must subclass the `{nameof(WebAuthenticatorCallbackActivity)}` and create an IntentFilter for it which matches your `{nameof(callbackUrl)}`."); } // Cancel any previous task that's still pending if (tcsResponse?.Task != null && !tcsResponse.Task.IsCompleted) { tcsResponse.TrySetCanceled(); } tcsResponse = new TaskCompletionSource <WebAuthenticatorResult>(); currentRedirectUri = callbackUrl; if (!(await StartCustomTabsActivity(url))) { // Fall back to opening the system-registered browser if necessary var urlOriginalString = url.OriginalString; var browserIntent = new Intent(Intent.ActionView, global::Android.Net.Uri.Parse(urlOriginalString)); Platform.CurrentActivity.StartActivity(browserIntent); } return(await tcsResponse.Task); }
public async Task <WebAuthenticatorResult> AuthenticateAsync(WebAuthenticatorOptions webAuthenticatorOptions) { var url = webAuthenticatorOptions?.Url; var callbackUrl = webAuthenticatorOptions?.CallbackUrl; var packageName = Application.Context.PackageName; // Create an intent to see if the app developer wired up the callback activity correctly var intent = new Intent(Intent.ActionView); intent.AddCategory(Intent.CategoryBrowsable); intent.AddCategory(Intent.CategoryDefault); intent.SetPackage(packageName); intent.SetData(global::Android.Net.Uri.Parse(callbackUrl.OriginalString)); // Try to find the activity for the callback intent if (!PlatformUtils.IsIntentSupported(intent, packageName)) { throw new InvalidOperationException($"You must subclass the `{nameof(WebAuthenticatorCallbackActivity)}` and create an IntentFilter for it which matches your `{nameof(callbackUrl)}`."); } // Cancel any previous task that's still pending if (tcsResponse?.Task != null && !tcsResponse.Task.IsCompleted) { tcsResponse.TrySetCanceled(); } tcsResponse = new TaskCompletionSource <WebAuthenticatorResult>(); currentRedirectUri = callbackUrl; var parentActivity = ActivityStateManager.Default.GetCurrentActivity(true); var customTabsActivityManager = CustomTabsActivityManager.From(parentActivity); try { if (await BindServiceAsync(customTabsActivityManager)) { var customTabsIntent = new CustomTabsIntent.Builder(customTabsActivityManager.Session) .SetShowTitle(true) .Build(); customTabsIntent.Intent.SetData(global::Android.Net.Uri.Parse(url.OriginalString)); WebAuthenticatorIntermediateActivity.StartActivity(parentActivity, customTabsIntent.Intent); } else { // Fall back to opening the system browser if necessary var browserIntent = new Intent(Intent.ActionView, global::Android.Net.Uri.Parse(url.OriginalString)); ActivityStateManager.Default.GetCurrentActivity().StartActivity(browserIntent); } return(await tcsResponse.Task); } finally { try { customTabsActivityManager.Client?.Dispose(); } finally { } } }