【发布时间】: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