Непойманный (в обещании) NotAllowedError: разрешение отклонено в MAUI AndroidAndroid

Форум для тех, кто программирует под Android
Ответить
Anonymous
 Непойманный (в обещании) NotAllowedError: разрешение отклонено в MAUI Android

Сообщение Anonymous »

В моем многопроектном приложении MAUI я загружаю внешний URL-адрес с помощью WebView Maui, на этой странице есть возможность записи звука. Я создал собственный обработчик для этой функции, и он вызывается; однако я столкнулся с ошибкой разрешения.
Общий код проекта
public class WebPagewithMenuItem : ContentPage
{

private static string title = "";
private static string hostUrl = "";
private readonly CustomWebView browser = new CustomWebView();

public WebPagewithMenuItem(string url, string token, string pageName, string hostUrlString)
{
title = pageName;
hostUrl = hostUrlString;
var html = setHtml(url, token);

switch (DeviceInfo.Platform)
{
case var value when value == DevicePlatform.WinUI:
break;

case var value when value == DevicePlatform.iOS:
break;

default:
browser.Source = html;
browser.Navigating += Browser_Navigating;
browser.On().SetEnableZoomControls(true).SetDisplayZoomControls(true);
Content = browser;
break;
}
}

private void Browser_Navigating(object? sender, WebNavigatingEventArgs e)
{
var args = new DecisionHandlerDelegate();
args.Cancel = e.Cancel;
args.Uri = e.Url;
WebView_OnNavigationStarted(sender, args);
}

private HtmlWebViewSource setHtml(string url, string token)
{
var html = new HtmlWebViewSource
{
Html = @"

.loader {
border: 4px solid #f3f3f3;
border-radius: 50%;
border-top: 4px solid #3498db;
width: 40px;
height: 40px;
-webkit-animation: spin 2s linear infinite; /* Safari */
animation: spin 2s linear infinite;
position: absolute;
left: calc(50% - 20px);
top: calc(50% - 20px);
}

/* Safari */
@-webkit-keyframes spin {
0% { -webkit-transform: rotate(0deg); }
100% { -webkit-transform: rotate(360deg); }
}

@keyframes spin {
0% { transform: rotate(0deg); }
100% { transform: rotate(360deg); }
}







document.getElementById('formIframe').submit();
"
};

return html;
}

private async void WebView_OnNavigationStarted(object? sender, DecisionHandlerDelegate e)
{
string uriLower = e.Uri.ToLower();
if (!uriLower.Contains("data:text/html;charset=utf-8;base64"))
{
if (uriLower.Contains("/externalauth/authaccess") == false && uriLower.Contains("/externalauth/mobilehost") == false && e.Uri.Contains("file:///") == false && e.Uri.Contains("about:blank") == false && uriLower.Contains("/help") == false && uriLower.Contains("errors/mobileerror") == false && uriLower.Contains("security/login") == false && uriLower.Contains("mvc=0") == false)
{
string urlValue = (System.Net.WebUtility.UrlDecode(e.Uri)).Replace(hostUrl, "..");
string newPageURL = "";
newPageURL = hostUrl + "/externalauth/mobilehost?url=" + System.Net.WebUtility.UrlEncode(urlValue);

switch (DeviceInfo.Platform)
{
case var value when value == DevicePlatform.WinUI:
break;

default:
var webview = (Microsoft.Maui.Controls.WebView)sender;
if (webview != null)
{
webview.Source = newPageURL;
}
break;
}
}
else if (uriLower.Contains("errors/mobileerror"))
{
MainThread.BeginInvokeOnMainThread(() =>
{
Navigation.RemovePage(this.Navigation.NavigationStack[this.Navigation.NavigationStack.Count - 1]);
Navigation.PopAsync();
});

e.Cancel = true;
browser.IsVisible = false;
}
else if (uriLower.Contains("security/login"))
{
MainThread.BeginInvokeOnMainThread(() =>
{
Navigation.RemovePage(this.Navigation.NavigationStack[this.Navigation.NavigationStack.Count - 1]);
Navigation.PopAsync();
});

e.Cancel = true;
browser.IsVisible = false;
}
}
}

private void WebPagewithMenuItem_ChildRemoved(object? sender, ElementEventArgs e)
{
switch (DeviceInfo.Platform)
{
case var value when value == DevicePlatform.WinUI:
var mainPage = ((NavigationPage)Application.Current.MainPage);
if (mainPage != null)
{
mainPage.ToolbarItems.Clear();
}
break;

default:
break;
}
((NavigationPage)Application.Current.MainPage).ChildRemoved -= WebPagewithMenuItem_ChildRemoved;
}
}

Пользовательский веб-представление
public class CustomWebView : Microsoft.Maui.Controls.WebView
{

}

На стороне Android.....
public class CustomWebViewHandler : WebViewHandler
{
protected override void ConnectHandler(Android.Webkit.WebView platformView)
{
base.ConnectHandler(platformView);

// Enable JavaScript and configure other settings
platformView.Settings.JavaScriptEnabled = true;
platformView.Settings.DomStorageEnabled = true;
platformView.Settings.MediaPlaybackRequiresUserGesture = false;
platformView.SetWebChromeClient(new CustomWebChromeClient());
}

protected override void DisconnectHandler(Android.Webkit.WebView platformView)
{
platformView.SetWebChromeClient(null);
base.DisconnectHandler(platformView);
}
}

public class CustomWebChromeClient : WebChromeClient
{
public override void OnPermissionRequest(PermissionRequest request)
{
// Check if microphone access is included in the request
if (request.GetResources().Contains(PermissionRequest.ResourceAudioCapture))
{
request.Grant(request.GetResources());
}
else
{
base.OnPermissionRequest(request);
}
}
}

MainActivity.cs
protected async override void OnResume()
{
try
{
base.OnResume();

PermissionStatus status = await Permissions.CheckStatusAsync
();

if (status != PermissionStatus.Granted)
await Permissions.RequestAsync();
}
}

Зарегистрировано в MauiProgram на стороне Android
public static class MauiProgram
{
public static MauiApp CreateMauiApp()
{
var builder = MauiApp.CreateBuilder();

builder
.UseSharedMauiApp()
.ConfigureMauiHandlers((handlers) =>
{
handlers.AddHandler(typeof(CustomWebView), typeof(CustomWebViewHandler));
});
return builder.Build();
}
}

Я также добавил разрешения в AndroidManifest




Подробнее здесь: https://stackoverflow.com/questions/791 ... ui-android
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Android»