【问题标题】:XML file in assets folder cannot access res/raw folderassets 文件夹中的 XML 文件无法访问 res/raw 文件夹
【发布时间】:2014-06-17 11:14:28
【问题描述】:

我应该先介绍一些背景。我们即将发布一款适用于安卓平台的非盈利 html5 儿童游戏。我使用 eclipse 创建了一个 apk 文件,但没有音频(游戏的其余部分工作正常)。我试过电话间隙,但游戏没有音频。经过几天的研究和可能的解决方案,我决定在 stackoverflow 上提问。

游戏使用html/css/js。

Eclipse 中的项目文件夹结构为: assets(android_assets)->www->index.html、game.xml、js 文件夹(游戏引擎)、styles 文件夹和 assets 文件夹。 子资产文件夹包含 -> 音乐文件夹、图像文件夹和背景文件夹

错误信息: index.html 文件加载 game.xml。 game.xml 文件加载 assets 文件夹中的所有文件。但是,在 logcat 中找不到所有音乐文件:
无法打开文件“/android_asset/www/assets/music/song.mp3。” (无此文件或目录)。我的 xml 文件声音调用是:<source href="assets/music/song.mp3" type="mp3" />.
我对当前加载正常的图像和背景使用相同的参考结构。从外部网址(如 www.oursever.com/song.mp3)加载音乐时。当在 Android 设备上作为 apk 文件运行时,该游戏能够很好地播放歌曲。所以代码是对的但是apk文件中歌曲的本地文件路径是错误的。

经过大量阅读,我了解到资产文件夹已压缩,不建议在未解压缩的情况下从该文件夹中读取音频文件。另一种方法是将 mp3 文件放在 res/raw 文件夹中。我将我的 xml 更改为:''。但是,我收到关于找不到文件的相同错误。我知道 res 文件夹中的项目使用标识符。但我不确定我应该在 xml 源文件路径中放什么来引用 res/raw 中的歌曲。我使用以下代码打印出歌曲的文件路径:System.out.println("Raw Path: " + getString(R.raw.menu));

哦,我尝试的另一种方法是将整个应用程序推送到 SDCard。我仍然收到“找不到文件”错误。

应用权限:

 - <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
 - <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>   
 - <uses-permission android:name="android.permission.INTERNET"/>
 - <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>

总结

游戏在我们的本地网络服务器上运行良好,包含所有资产。当尝试使用 Eclipse 和 Phonegap 选项创建 apk 文件时,会产生没有音频的游戏。我读到资产文件夹每个文件有 1 mb 的限制,所以这是我尝试使用 res/raw 文件夹的另一个原因。阻止我们发布这款非盈利儿童游戏的唯一问题是我在 apk 文件中找不到音乐文件的位置。我已经探索了 apk 文件的内容,它显示 song.mp3 位于 res/raw/ 文件夹中。然而,Android SDK 没有声明。有人有什么想法吗?

谢谢你四次,

这是我第一次在这里发帖,如果有什么令人困惑的地方,请告诉我。

更新 1 我通过尝试从 SD 卡中读取歌曲来尝试另一种想法,当我尝试这样做时,我收到了一个权限被拒绝错误(所以它确实找到了文件)。即使我设置了 READ_EXTERNAL_STORAGE 权限,我的应用程序仍被拒绝使用 mp3 文件。所以我尝试从原始目录复制歌曲,在 sd 卡上创建一个新文件夹,然后使用此链接将文件放入新文件夹中: How to Copy Raw files into SD Card

使用此解决方案时,永远不会创建文件夹,也永远不会复制文件。安装到手机后,我也找不到我的应用程序。我检查了 internal storage->sdcard 文件夹并检查了 com 文件夹。我还检查了我的外部存储 - > sdcard 中的 com.mycompany 文件夹,而不是它们。我们的测试手机运行的是 Android 4.1.2。

更新 2 我尝试了示例项目的建议''。我收到错误无法打开文件“android.resource://com.mycompany/raw/song.mp3”。 (无此文件或目录)。 Song.mp3 位于 res/raw 文件夹中。我通过尝试从 SD 卡中读取歌曲来尝试另一种想法,当我尝试这样做时,我收到了一个权限被拒绝错误(所以它确实找到了文件)。即使我设置了 READ_EXTERNAL_STORAGE 权限。

更新 3 我正在从头开始再次从事一个空白项目。我上一个项目使用的教程是:https://www.youtube.com/watch?v=QRa4yMjoI7c 我会在下周一更新这篇文章,谢谢 Andrew 和其他至少看过这篇文章的人。

更新 4 我制作了一个示例项目,并在此处上传: http://tinyurl.com/p7s5w2v 转到文件然后下载。 该项目非常小,但您可以看到我将 menu.mp3 文件放在 raw/res 目录中,并且“android.resource://com.mycompany/raw/menu.mp3”在调用时无法找到歌曲在“fisher.xml”中。这首歌在我们的网络服务器和本地服务器上正常播放。但是在 android 设备或模拟器上运行时找不到 menu.mp3。我总是可以告诉 xml 文件从我们的网络服务器加载游戏的所有音频文件,但这会很慢。

更新 5 当前尝试:

source href="android.resource://com.brg.example/raw/menu" file not found
source href="sdcard/menu.mp3" permission denied on sdcard (app has read access)
source href="storage/sdcard0/menu.mp3" permission denied
source href="file:///assets/music/menu.mp3" file not found

清单文件:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.brg.example"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk
        android:minSdkVersion="16"
        android:targetSdkVersion="19" />
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name="com.brg.example.MainActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>

更新 6 我决定使用 url 从远程服务器加载媒体文件。我最初认为将 html 项目转换为带有音频的 android webview 会比其他平台花费更少的时间。我错了。我们将来可能会再次访问 Android。在我们为他们的服务付费后,PhoneGap 支持团队基本上保持沉默。我感谢所有决定浏览此帖子的人。

【问题讨论】:

    标签: android xml html phonegap-build


    【解决方案1】:

    试试这个:“android.resource://com.your.package/raw/filename”

    【讨论】:

    • 我使用了您对示例项目 '' 的建议。我收到错误无法打开文件“android.resource://com.mycompany/raw/song.mp3”。 (无此文件或目录)。 Song.mp3 位于 res/raw 文件夹中。我通过尝试从 SD 卡中读取歌曲来尝试另一种想法,当我尝试这样做时,我收到了一个权限被拒绝错误(所以它确实找到了文件)。即使我设置了 READ_EXTERNAL_STORAGE 权限。
    • 您的包名是否只有“com.mycompany”?它应该分为三个部分。你确定你使用的是整个包名吗?
    • 它只有两个部分,因为我从一个仅列出两个部分的示例中制作了该项目。但我要从头开始制作一个新项目,我会告诉你进展如何,谢谢 Andrew!
    • 我创建了一个新的示例项目,该项目加载除了歌曲之外的所有内容。如果您想在以下网址查看这个小项目:tinyurl.com/p7s5w2v 转到文件,下载。我收到了关于无法找到音乐文件的相同错误)。
    【解决方案2】:

    我刚刚遇到了类似的问题——对我来说,关键部分是省略了媒体文件的扩展名:android.resource://com.mycompany/raw/song

    【讨论】:

    • 感谢您的回复,但我在更新 #5 中尝试过此操作>
    猜你喜欢
    • 1970-01-01
    • 2013-10-07
    • 1970-01-01
    • 2014-10-05
    • 1970-01-01
    • 1970-01-01
    • 2012-01-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多