Xamarin使用CrossSimpleAudioPlayer播放声音

mic*_*nha 9 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");
Run Code Online (Sandbox Code Playgroud)

当我改为加载Stream时,抛出错误“ 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
Run Code Online (Sandbox Code Playgroud)

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

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

Jun*_*ang 2

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

它有这样的路径:

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

您必须从公共外部存储私有外部存储读取文件。这取决于您是否希望 MediaStore 内容提供商可以访问您的声音文件。

这里可以从公共外部存储中读取声音文件,其路径如下:

/存储/模拟/0/.../

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

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
Run Code Online (Sandbox Code Playgroud)

但这还不够。在访问外部存储之前必须先请求许可,如下所示(在此处使用 Android 项目的 NuGet 插件 Current Activity 来获取当前活动):

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

            ActivityCompat.RequestPermissions(currentActivity, new string[] {
                Manifest.Permission.ReadExternalStorage,
                Manifest.Permission.WriteExternalStorage
            }, requestCode);
Run Code Online (Sandbox Code Playgroud)

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

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");
            }
Run Code Online (Sandbox Code Playgroud)

如果不能在 CrossSimpleAudioPlayer 中工作,您可以使用DependencyServiceMediaPlayer来播放 Audio.Best 使用流来播放,如下所示:

File tempFile = new File(path);           
FileInputStream fis = new FileInputStream(tempFile);             
mediaPlayer.reset();             
mediaPlayer.setDataSource(fis.getFD());             
mediaPlayer.prepare();             
mediaPlayer.start();
Run Code Online (Sandbox Code Playgroud)