Xamarin使用CrossSimpleAudioPlayer播放声音

时间:2019-03-07 10:22:53

标签: xamarin xamarin.forms

我想播放使用CrossSimpleAudioPlayer插件下载的声音。

我实例化并初始化了插件,并且在IOS上一切正常,但是在android上,当我加载文件“ Java.IO.FileNotFoundException”时,它给了我这个错误。 但该文件存在并且有权读取

然后在控制台上显示此“ [MediaPlayer]错误(1,-2147483648)”。

我以这种方式加载剪辑

ISimpleAudioPlayer player = Plugin.SimpleAudioPlayer.CrossSimpleAudioPlayer.Current;
player.Load("/data/user/0/com.my.app/files/20.wav");

当我加载流时,抛出错误“ Java.IO.IOException:准备失败。:status = 0x1”

var temp = new MemoryStream(DependencyService.Get<IFileHelper>().GetFileAsByte(path));
//This works fine and loads the file
player.Load(temp); //throws the error

如果我加载链接而不是本地文件,则可以正常工作,但是我需要一个本地文件。

我不知道为什么在Android上会发生这种情况

1 个答案:

答案 0 :(得分:1)

您正在从内部存储(文件目录)读取声音文件。 Files目录是专用目录,只能由您的应用程序访问。用户或操作系统都无法访问该文件。

这具有这样的路径:

  

/data/user/0/com.my.app/files/20.wav

您必须从Public External StoragePrivate External Storage中读取文件。这取决于您是否希望MediaStore内容提供商访问您的声音文件。

此处可以从公共外部存储读取声音文件,该文件的路径如下:

  

/ storage / emulated / 0 /.../

并且需要向清单中添加权限:

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

但是还不够。像这样访问外部存储之前,必须先征得许可(在此处使用NuGet插件,Android项目为“当前活动”以获取当前活动):

var currentActivity = CrossCurrentActivity.Current.Activity;
            int requestCode=1;

            ActivityCompat.RequestPermissions(currentActivity, new string[] {
                Manifest.Permission.ReadExternalStorage,
                Manifest.Permission.WriteExternalStorage
            }, requestCode);

如果授予许可,则继续并将文件复制到外部存储:

var recordingFileExternalPath = Path.Combine(Android.OS.Environment.ExternalStorageDirectory.Path, AppConstants.CUSTOM_ALERT_FILENAME);

            if (ContextCompat.CheckSelfPermission(Android.App.Application.Context, Manifest.Permission.WriteExternalStorage) == (int)Permission.Granted)
            {
                try
                {
                    if (File.Exists(recordingFileExternalPath))
                    {
                        File.Delete(recordingFileExternalPath);
                    }

                    File.Copy(filePath, recordingFileExternalPath);
                }
                catch (Exception ex)
                {
                    Console.WriteLine(ex.Message);
                }
            }
            else
            {
                UserDialogs.Instance.Alert("Permission to write to External Storage not approved, cannot save settings.", "Permission Denied", "Ok");
            }

如果在CrossSimpleAudioPlayer中不起作用,则可以将DependencyServiceMediaPlayer一起使用来播放音频。最好使用流播放如下:

File tempFile = new File(path);           
FileInputStream fis = new FileInputStream(tempFile);             
mediaPlayer.reset();             
mediaPlayer.setDataSource(fis.getFD());             
mediaPlayer.prepare();             
mediaPlayer.start();