我想播放使用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上会发生这种情况
答案 0 :(得分:1)
您正在从内部存储(文件目录)读取声音文件。 Files目录是专用目录,只能由您的应用程序访问。用户或操作系统都无法访问该文件。
这具有这样的路径:
/data/user/0/com.my.app/files/20.wav
您必须从Public External Storage或Private 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中不起作用,则可以将DependencyService与MediaPlayer一起使用来播放音频。最好使用流播放如下:
File tempFile = new File(path);
FileInputStream fis = new FileInputStream(tempFile);
mediaPlayer.reset();
mediaPlayer.setDataSource(fis.getFD());
mediaPlayer.prepare();
mediaPlayer.start();