我可以使用以下代码在 Unity 编辑器中使用 UnityWebRequestMultimedia.GetAudioClip 加载音频,但是当我在 Android 上运行它时,我无法从用户设备加载任何文件。
void Start() {
audio = GetComponent<AudioSource>();
string fullPath = Path.Combine("file://" + previewSong);
StartCoroutine(GetAudioClip(fullPath));
}
IEnumerator GetAudioClip(string fullPath)
{
using (var uwr = UnityWebRequestMultimedia.GetAudioClip(fullPath, AudioType.MPEG))
{
((DownloadHandlerAudioClip)uwr.downloadHandler).streamAudio = true;
yield return uwr.SendWebRequest();
if (uwr.isNetworkError || uwr.isHttpError)
{
debugSongPath2.text = uwr.error;
yield break;
}
DownloadHandlerAudioClip dlHandler = (DownloadHandlerAudioClip)uwr.downloadHandler;
if (dlHandler.isDone)
{
audio.clip = dlHandler.audioClip;
if (audio.clip != null)
{
audio.clip = DownloadHandlerAudioClip.GetContent(uwr);
Debug.Log("Playing song using Audio Source!");
}
else
{
Debug.Log("Couldn't find a valid AudioClip.");
}
}
else
{
Debug.Log("The download process is not completely finished.");
}
}
}
我遇到的错误取决于我如何形成 URL 的开头。
Path.Combine("file:/" + previewSong);
malformed URL
Path.Combine("file://" + previewSong);
http:/1.1 404 not found
Path.Combine("file:///" + previewSong);
unknown error
Path.Combine("file:////" + previewSong);
unknown error
当我在手机上输出 URL 时,它们看起来是正确的。这是一个示例路径:
file:///storage/emulated/0/Music/Deorro/Deorro - Five Hours.mp3
我之前使用 WWW.GetAudioClip 成功地从此 URL 加载音频,但那已经过时了。这使我相信 URL 是正确的。我试过使用和不使用开发模式进行构建。不知道还能尝试什么。我想让它与 UnityWebRequestMultimedia 一起使用,但如果有其他更有效的加载本地文件的方法,我愿意接受它。
更改构建设置以授予对外部 SD 卡的写入权限。我正在使用下面的代码从 android 中的指定位置获取音频。我试过你的代码,但不知何故它不起作用。
IEnumerator GetAudioClip2(string fullPath)
{
debugSongPath2.text = previewSong;
using (UnityWebRequest www = UnityWebRequestMultimedia.GetAudioClip(fullPath, AudioType.MPEG))
{
yield return www.SendWebRequest();
if (www.isNetworkError || www.isHttpError)
{
Debug.Log(www.error);
}
else
{
AudioClip myClip = DownloadHandlerAudioClip.GetContent(www);
audioSource.clip = myClip;
audioSource.Play();
}
}
}
我的完整路径是“file:///storage/emulated/0/Samsung/Music/Over the Horizon.mp3”
问题出在新的 Android 11 范围存储中,它禁用了 READ_EXTERNAL_STORAGE。我必须将以下内容添加到我的 AndroidManifest.xml 中:
<manifest ... >
<!-- This attribute is "false" by default on apps targeting Android 10 or higher. -->
<application android:requestLegacyExternalStorage="true" ... >
...
</application>
</manifest>
https://developer.android.com/training/data-storage/use-cases#opt-out-scoped-storage
async void GetAudioClip(string audioURL, GameObject itemMedia) { 尝试 { audioPlayer.clip = await UnityHttpClient.GetAudioClip(audioURL);
panelLoading.SetActive(false);
timeEndAudio.GetComponent<Text>().text = Helper.FormatTime(audioPlayer.clip.length);
sliderControlAudio.GetComponent<Slider>().maxValue = audioPlayer.clip.length;
btnControlAudio.interactable = true;
btnExitAudio.interactable = true;
IsPlayingAudio = true;
ControlAudio(IsPlayingAudio);
}
catch (Exception exception)
{
SetUIErrorNetwork(itemMedia);
Toast.ShowCommonToast(exception.Message, APIUrlConfig.SERVER_ERROR_RESPONSE_CODE);
}
}