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.

Android o IOS: realiza acciones específicas según el dispositivo.

En resumen, quiero grabar audio desde un micrófono en teléfonos Android o iOS una vez que se presiona un botón de grabación desde XAML. Obviamente, el código específico de Android estará en el proyecto de Android y el de iOS en el proyecto de iOS (ver imagen). El problema principal es que el manejo de audio es diferente para cada tipo de dispositivo, por lo que no puedo usar código compartido para eso. Entonces, ¿hay alguna manera de señalar desde la presión de los botones en XAML, que se encuentra bajo su propio proyecto (que usa código compartido), al dispositivo actualmente en uso, ya sea Android o iOS?

Por ejemplo, se hace clic en un botón para comenzar a grabar -> XAML notifica a mi archivo cs bajo el código compartido que desea comenzar a grabar y envía alguna señal o llama al código correspondiente al tipo de dispositivo actual, por ejemplo, Android o iOS -> ese dispositivo comienza a grabar desde su código cs.

Espero que esto tenga sentido.

Imagen

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Grabación de audio desde un micrófono en Android y iOS utilizando Xamarin.Forms

    Para grabar audio desde un micrófono en teléfonos Android o iOS una vez que se presiona un botón de grabación en XAML, puedes utilizar el servicio de dependencia de Xamarin.Forms. El servicio de dependencia te permite llamar a las API específicas de la plataforma desde el código compartido en Xamarin.Forms.

    Crea una interfaz llamada IAudioRecorder en el proyecto de código compartido:

    public interface IAudioRecorder
    {
        void StartRecording();
        void StopRecording();
    }
    

    Implementa la interfaz con código específico de la plataforma en los proyectos de Android e iOS:

    Implementación para Android

    [assembly: Dependency(typeof(AudioRecorder))]
    namespace YourNamespace.Droid
    {
        public class AudioRecorder : IAudioRecorder
        {
            private MediaRecorder _recorder;
    
            public void StartRecording()
            {
                _recorder = new MediaRecorder();
                _recorder.SetAudioSource(AudioSource.Mic);
                _recorder.SetOutputFormat(OutputFormat.Default);
                _recorder.SetAudioEncoder(AudioEncoder.Default);
                _recorder.SetOutputFile(GetFilePath());
                _recorder.Prepare();
                _recorder.Start();
            }
    
            public void StopRecording()
            {
                _recorder.Stop();
                _recorder.Reset();
                _recorder.Release();
                _recorder.Dispose();
                _recorder = null;
            }
    
            private string GetFilePath()
            {
                var dirPath = Android.OS.Environment.GetExternalStoragePublicDirectory(Android.OS.Environment.DirectoryMusic).AbsolutePath;
                var fileName = $"{DateTime.Now.ToString("yyyyMMdd_HHmmss")}.mp4";
                return Path.Combine(dirPath, fileName);
            }
        }
    }
    

    Implementación para iOS

    [assembly: Dependency(typeof(AudioRecorder))]
    namespace YourNamespace.iOS
    {
        public class AudioRecorder : IAudioRecorder
        {
            private AVAudioRecorder _recorder;
            private NSDictionary _settings;
    
            public void StartRecording()
            {
                var dirPath = NSSearchPath.GetDirectories(NSSearchPathDirectory.MusicDirectory, NSSearchPathDomain.User, true)[0];
                var filePath = Path.Combine(dirPath, $"{DateTime.Now.ToString("yyyyMMdd_HHmmss")}.caf");
                _settings = NSDictionary.FromObjectsAndKeys(
                    new NSObject[] { NSNumber.FromFloat(44100.0f), NSNumber.FromInt32((int)AVAudioQuality.High) },
                    new NSObject[] { AVSampleRateKey, AVEncoderAudioQualityKey }
                );
                _recorder = AVAudioRecorder.Create(new NSUrl(filePath), new AudioSettings(_settings), out NSError error);
                _recorder.PrepareToRecord();
                _recorder.Record();
            }
    
            public void StopRecording()
            {
                _recorder.Stop();
                _recorder.Dispose();
                _recorder = null;
            }
        }
    }
    

    En tu XAML, crea un botón con un controlador de eventos click:

    <button text="Grabar" clicked="OnRecordButtonClicked"></button>
    

    En el código principal, agrega el controlador de eventos click y llama a los métodos de IAudioRecorder:

    “`csharp
    private readonly IAudioRecorder _audioRecorder = DependencyService.Get();

    private void OnRecordButtonClicked(object sender, EventArgs e)
    {
    if (_audioRecorder != null)
    {
    _audioRecorder.StartRecording();
    }
    }

    private void OnStopButtonClicked(object sender, EventArgs e)
    {
    if (_audioRecorder != null)
    {
    _audioRecorder.StopRecording();
    }
    }
    “`

Comments are closed.