Записанный файл не воспроизводится в xamarin android - PullRequest
0 голосов
/ 19 января 2020

Привет, я просто создаю приложение для записи звонков в xamarin android. У меня есть логи записи звонков c, добавленные в Приемник вещания. когда я добавляю эту логи c в активности и пытаюсь записать голос, все работает нормально. но когда я помещаю logi c в файлы приемника вещания, создаются аудиофайлы, но когда я пытаюсь воспроизвести его, он не воспроизводит звук и не выдает никаких ошибок. Даже размер файла больше 10 МБ, что означает, что файлы также не пусто. Может кто-нибудь, пожалуйста, помогите мне в этом. Вот мой полный код приемника вещания

//Boroadcast receiver start here

using System;
using System.Collections.Generic;
using System.IO;
using System.Text;
using System.Threading;
using Android.App;
using Android.Content;
using Android.Media;
using Android.OS;
using Android.Runtime;
using Android.Telephony;
using Android.Util;
using Android.Views;
using Android.Widget;
namespace App2
{
    [BroadcastReceiver(Enabled = true, Exported = true)]
    [IntentFilter(new[] {  TelephonyManager.ActionPhoneStateChanged, Intent.ActionNewOutgoingCall })]
    public class SimpleBroadCast : BroadcastReceiver
    {
        MediaRecorder _recorder;

        public override void OnReceive(Context context, Intent intent)
        {

            try
            {
                var state = intent.GetStringExtra(TelephonyManager.ExtraState);
                var status = intent.GetStringExtra(Intent.ExtraPhoneNumber);
                Toast.MakeText(context, "OnReceive start"+ status, ToastLength.Long).Show();
                if (state == TelephonyManager.ExtraStateOffhook)
                {
                    StartRecording(context);
                }
                else if (state == TelephonyManager.ExtraStateIdle)
                {
                   StopRecording(context);
                }

                Toast.MakeText(context, "OnReceive end", ToastLength.Long).Show();
            }
            catch(Exception ex)
            {
                Toast.MakeText(context, ex.Message, ToastLength.Long).Show();
            }
        }

        //Method to stop recording
        void StopRecording(Context context)
        {
            _recorder = PhoneListner.mediaRecorder;
            if (_recorder == null)
            {

                return;
            }
            _recorder.Stop();
            _recorder.Release();
            _recorder = null;
            Toast.MakeText(context, "Recording Stop", ToastLength.Long).Show();

        }

        void StartRecording(Context context)
        {
            _recorder = new MediaRecorder();
            _recorder.SetAudioSource(AudioSource.Mic);
            _recorder.SetOutputFormat(OutputFormat.ThreeGpp);
            _recorder.SetOutputFile(GetFileNameForRecording(context));
            _recorder.SetAudioEncoder((AudioEncoder.AmrNb));

            try
            {
                _recorder.Prepare();
            }
            catch (IOException ioe)
            {
               // Log.Error(TAG, ioe.ToString());
            }

            _recorder.Start();
            PhoneListner.mediaRecorder = _recorder;//storing the object in property for future use to 
            //stop the recording
            Toast.MakeText(context, "Recording started", ToastLength.Long).Show();


        }

        public string GetFileNameForRecording(Context context)
        {

            var filename = "Rec_" + DateTime.Now + ".3gpp";//code to generate dynamic file name
    string dir= context.GetExternalFilesDir(Android.OS.Environment.DirectoryDownloads).AbsolutePath;

            string file = Path.Combine(dir, filename);
            return file;
        }

    }
}
...