Flutter - 播放来自平台特定文件夹的声音文件(例如 Android 的 android/app/src/main/res/raw)
Posted
技术标签:
【中文标题】Flutter - 播放来自平台特定文件夹的声音文件(例如 Android 的 android/app/src/main/res/raw)【英文标题】:Flutter - Play sound files from platform specific folders (e.g. android/app/src/main/res/raw for Android) 【发布时间】:2022-01-18 10:44:17 【问题描述】:在我的 Flutter 应用程序中,我将一些自定义声音文件放在 android/app/src/main/res/raw
中,用作通知音。现在我想在用户选择使用Just audio 包时播放这些声音。不确定如何引用和播放这些文件(或平台文件夹中的任何资源,就此而言)。现在我不得不将它们复制到资产文件夹并从那里播放,这显然不是一个好的解决方案。
【问题讨论】:
为什么资产会不好?您是如何从资产中播放它们的? 我使用的通知包 (pub.dev/packages/awesome_notifications) 不支持资产中的声音文件,并要求将它们放置在该特定位置。 【参考方案1】:对于原始资源,您可以使用:
Audiosource.uri(Uri('rawresource:///resourceId'))
【讨论】:
如何使用它来播放位于res/raw/abc.m4a
的文件?答案中没有这样的 Uri 构造函数。尝试使用 Uri(scheme: 'rawresource', path: 'raw/abc')
和 Uri(scheme: 'rawresource', path: 'abc')
但出现错误。
我想知道这在 Flutter 中是否可以实现,正如 this SO answer 中提到的那样 “但是,您将无法直接将可绘制项目共享给 Flutter”跨度>
资源名称是abc
,所以你可以使用这个:Uri.parse('rawresource:///abc)
。这应该起作用的原因是 just_audio 将您的 URI 直接传递给解释它的 ExoPlayer,这就是 ExoPlayer 应该如何解释这个 URI。一个例外是,如果您的 URI 具有 asset
方案。这不会传递给 ExoPlayer,它会被 just_audio 拦截,而是从你的颤振资产中加载文件。
这会出现以下错误:E/ExoPlayerImplInternal(29564): Caused by: com.google.android.exoplayer2.upstream.RawResourceDataSource$RawResourceDataSourceException: Resource identifier must be an integer.
有关更多信息,您可以在此处查看 ExoPlayer 文档:exoplayer.dev/doc/reference/com/google/android/exoplayer2/… just_audio 会将您的 URI 直接传递给 ExoPlayer,然后该页面解释 ExoPlayer 如何解释您的资源 URI。以上是关于Flutter - 播放来自平台特定文件夹的声音文件(例如 Android 的 android/app/src/main/res/raw)的主要内容,如果未能解决你的问题,请参考以下文章