Blazor MAUI - 相机和麦克风 Android 权限

Posted

技术标签:

【中文标题】Blazor MAUI - 相机和麦克风 Android 权限【英文标题】:Blazor MAUI - Camera and Microphone Android permissions 【发布时间】:2022-01-10 17:48:48 【问题描述】:

我正在尝试在<video> html 元素中显示来自摄像头和麦克风的实时流。

在 blazor 文件 (sample.razor) 中,我调用方法来请求和显示视频:

protected override async Task OnAfterRenderAsync(bool firstRender)
    
        await base.OnAfterRenderAsync(firstRender);

        if (firstRender)
        
            await JSRuntime.InvokeVoidAsync("requestMediaAndShow");
        
    

javascript 文件 (sample.js) 中,我请求流并分配给视频 html 元素。

// Create request options
let options = 
    audio: true,
    video: true
;

// Request user media
navigator.mediaDevices
    .getUserMedia(options)
    .then(gotLocalStream)
    .catch(logError);

但是当我提出请求时,我发现了类似“NotAllowedError: Permission denied”之类的错误。

androidManifest.xml 包含:

<uses-permission android:name="android.permission.RECORD_AUDIO" />
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />

MainActivity.cs 包含:

public class MainActivity : MauiAppCompatActivity

    protected override void OnCreate(Bundle savedInstanceState)
    
        base.OnCreate(savedInstanceState);

        ActivityCompat.RequestPermissions(this, new[]  Manifest.Permission.Camera, Manifest.Permission.RecordAudio, Manifest.Permission.ModifyAudiosettings , 0);
    

任何想法如何通过 javascript 在 BlazorWebView 中原生地在 android 上请求音频和视频流? PS。无论是在网站上还是在本地 Windows 平台上都运行良好,并且不需要额外的权限。

【问题讨论】:

有趣的问题!在我可以查看的 GitHub 存储库中的某个地方,你有这个小样本吗? 当然。回购地址:github.com/patrykplay/BlazorMauiAndroidDevices 这可能是 BlazorWebView 中的一个错误:github.com/dotnet/maui/issues/3694(来源:我是 BlazorWebView 的开发人员)。 【参考方案1】:

虽然Android权限似乎被授予OK,但我怀疑网站权限没有。不知道这个问题的作者是不是同一个人,但an issue was opened on the .NET MAUI repo也是这样。

虽然我们正在考虑使这项工作开箱即用,但另一位乐于助人的用户目前已发布此解决方法。

像这样实现你自己的处理程序

public class MauiWebChromeClient : WebChromeClient

    public override void OnPermissionRequest(PermissionRequest request)
    
        request.Grant(request.GetResources());
    


public class MauiBlazorWebViewHandler : BlazorWebViewHandler

    protected override WebChromeClient GetWebChromeClient()
    
        return new MauiWebChromeClient();
    

并在您的MauiProgram.cs 中注册此处理程序:

builder.ConfigureMauiHandlers(handlers =>

    handlers.AddHandler<IBlazorWebView, MauiBlazorWebViewHandler>();
);

这将自动授予来自 Web 端的所有请求的权限。

【讨论】:

不幸的是,这种解决方法似乎无法正常工作,我已经用我的发现更新了 github 问题。 啊,也许我太快了。我完全查看了您的“没有完全修复它但很好的起点”评论:D 原来我也太快了 :D,我只看了 github 问题并错过了在这个问题中所做的更详细的更改。当我在 MainActivity.cs 添加更改时,一切似乎都很好!【参考方案2】:

我认为您遗漏了权限检查的某些部分。您应该阅读本节,了解 Android 6.0 中引入的运行时权限。例如,我在 MainActivity 中看不到任何对 OnRequestPermissionsResult 的覆盖。

https://docs.microsoft.com/en-us/xamarin/android/app-fundamentals/permissions?tabs=macos#runtime-permission-checks-in-android-60

【讨论】:

以上是关于Blazor MAUI - 相机和麦克风 Android 权限的主要内容,如果未能解决你的问题,请参考以下文章

MAUI Blazor如何隐藏滚动条

在MAUI中使用Masa Blazor

Blazor Hybrid / MAUI 简介和实战

如何远程调试 MAUI blazor / Blazor Hybrid

在MAUI中使用Masa Blazor

MAUI使用Masa blazor组件库