这是问题所在。我有一个应用程序可以将音频文件下载到手机然后播放。所有工作都没有问题。但小问题是 - 客户希望在下载其他文件时立即播放一些东西。
所以我在 www/files/ 文件夹中放了一段简短的音频。这对 iOS 没有任何问题。我只是将它(来自媒体播放器)引用为
document.addEventListener('deviceready' , function()
{
var media = new Media('files/default.m4a' , function()
{
// this success call back never works!
});
setTimeout(function()
{
media.play();
},100);
});
现在的问题是安卓。收到 FileError.NOT_FOUND_ERR 错误。查看 LogCat(来自 Android 工作室)
路径变成
/mnt/sdcard/files/default.m4a
似乎Android无法处理像iOS这样的相对路径(奇怪的是,所有图像或模板都是js应用程序中的相对路径。它们都工作正常)。
一直在寻找解决方案,如何将一个音频文件复制到 SD 卡。到目前为止没有运气。问题是我无法正确找到原始文件的绝对路径。那里有很多完全是BS的例子。他们硬编码了路径!Android 可以是任何东西,在模拟器中是 /mnt/sdcard/ 在我的测试设备上变成 /external/sdcard0
这只是来自(java):
String path = Environment.getExternalStorageDirectory().getAbsolutePath();
我看到很多人都遇到了同样的问题。但是那里的解决方案已经过时了。或者没有真正解决第一个问题(首先要找出原始文件在哪里)。一定有很多人面临的一个问题吧?
提前致谢。
PS我也试试这个
this.getClass().getPackage().getName();
从 onCreate 方法内部调用。那只是让我部分而不是绝对路径。
更新
这是完整的工作代码(PhoneGap 3.1)
package YOUR_PACKAGE_NAME;
import android.os.Bundle;
import org.apache.cordova.*;
/* for the other two plugins */
import java.io.*;
import android.os.Environment;
import android.util.Log;
import android.content.res.AssetManager;
public class YourAppName extends CordovaActivity
{
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
super.init();
this.CopyAssets();
super.loadUrl(Config.getStartUrl());
}
private void CopyAssets() {
AssetManager assetManager = getAssets();
InputStream in = null;
OutputStream out = null;
try {
in = assetManager.open(FILE_YOU_WANT_TO_COPY_IN_WWW);
out = new FileOutputStream(Environment.getExternalStorageDirectory()
.toString()
+ WHERE_YOU_WANT_TO_PUT_IT_PLUS_NAME);
this.copyFile(in, out);
in.close();
in = null;
out.flush();
out.close();
out = null;
} catch (Exception e) {
Log.e("tag", e.getMessage());
}
}
private void copyFile(InputStream in, OutputStream out) throws IOException {
byte[] buffer = new byte[1024];
int read;
while ((read = in.read(buffer)) != -1) {
out.write(buffer, 0, read);
}
}
}