4

我可以使用 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 一起工作,但如果有另一种更有效的加载本地文件的方法,我愿意接受。

4

2 回答 2

0

更改您的构建设置以授予对外部 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 Horizo​​n.mp3”

于 2020-11-23T08:22:41.883 回答
0

问题在于禁用 READ_EXTERNAL_STORAGE 的新 Android 11 范围存储。我必须将以下内容添加到我的 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

于 2021-01-15T06:39:48.260 回答