es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Blazor MAUI – Permisos de cámara y micrófono para Android

Estoy tratando de mostrar la transmisión en vivo de la cámara y el micrófono en el elemento HTML <video>.

En el archivo de Blazor (sample.razor) invoco un método para solicitar y mostrar el video:

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

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

En el archivo de javascript (sample.js) solicito la transmisión y la asigno al elemento HTML de video.

// Crear opciones de solicitud
let options = {
    audio: true,
    video: true
};

// Solicitar medios al usuario
navigator.mediaDevices
    .getUserMedia(options)
    .then(gotLocalStream)
    .catch(logError);

Pero cuando solicito la transmisión, obtengo un error como “NotAllowedError: Permiso denegado”.

El archivo AndroidManifest.xml contiene:

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

El archivo MainActivity.cs contiene:

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);
    }
}

¿Alguna idea de cómo solicitar el flujo de audio y video a través de JavaScript en BlazorWebView en Android nativamente? PD: Tanto en el sitio web como en Windows funciona perfectamente y no se requieren permisos adicionales.

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Parece que el problema está relacionado con los permisos que no se han otorgado a la aplicación para acceder a la cámara y al micrófono. Ya has agregado los permisos necesarios en el archivo AndroidManifest.xml y los estás solicitando en MainActivity.cs. Sin embargo, es posible que los permisos no se estén otorgando por alguna razón.

    Puedes intentar verificar si los permisos se han otorgado antes de solicitarlos nuevamente. Puedes usar el método ActivityCompat.CheckSelfPermission para verificar si los permisos se han otorgado.

    Aquí tienes un ejemplo:

    public class MainActivity : MauiAppCompatActivity
    {
        private const int RequestCameraAndMicrophonePermissionCode = 1;
    
        protected override void OnCreate(Bundle savedInstanceState)
        {
            base.OnCreate(savedInstanceState);
    
            if (ActivityCompat.CheckSelfPermission(this, Manifest.Permission.Camera) != Permission.Granted ||
                ActivityCompat.CheckSelfPermission(this, Manifest.Permission.RecordAudio) != Permission.Granted ||
                ActivityCompat.CheckSelfPermission(this, Manifest.Permission.ModifyAudioSettings) != Permission.Granted)
            {
                ActivityCompat.RequestPermissions(
                    this, new[] { Manifest.Permission.Camera, Manifest.Permission.RecordAudio, Manifest.Permission.ModifyAudioSettings },
                    RequestCameraAndMicrophonePermissionCode);
            }
        }
    }
    

    Este código verifica si se han otorgado los permisos y los solicita solo si no se han otorgado. También puedes agregar una devolución de llamada para manejar el resultado de la solicitud de permisos y verificar si se otorgaron o no.

    public override void OnRequestPermissionsResult(int requestCode, string[] permissions, [GeneratedEnum] Permission[] grantResults)
    {
        if (requestCode == RequestCameraAndMicrophonePermissionCode)
        {
            if (grantResults.Length > 0 && grantResults[0] == Permission.Granted && grantResults[1] == Permission.Granted && grantResults[2] == Permission.Granted)
            {
                // Los permisos se otorgaron, hacer algo aquí
                return;
            }
            else
            {
                // Los permisos se denegaron, manejar el error aquí
                return;
            }
        }
    
        base.OnRequestPermissionsResult(requestCode, permissions, grantResults);
    }
    

    Este código maneja el resultado de la solicitud de permisos y verifica si se otorgaron o no.

    Con estos cambios, deberías poder solicitar el flujo de audio y video mediante JavaScript en BlazorWebView de forma nativa en Android.

Comments are closed.