Java PhoneGap 3.1 Android将音频文件从www文件夹复制到SD卡
问题就在这里。我有一个应用程序,可以将音频文件下载到手机上,然后播放。一切顺利。但小问题是——客户希望在下载其他文件时能够直接播放 所以我在www/files/文件夹中放了一段简短的音频。这在iOS上没有任何问题。我只是引用它(从媒体播放器)作为 现在的问题是Android。获取文件错误。未找到错误。查看LogCat(来自Android studio) 这条路变成了Java PhoneGap 3.1 Android将音频文件从www文件夹复制到SD卡,java,android,audio,cordova,media,Java,Android,Audio,Cordova,Media,问题就在这里。我有一个应用程序,可以将音频文件下载到手机上,然后播放。一切顺利。但小问题是——客户希望在下载其他文件时能够直接播放 所以我在www/files/文件夹中放了一段简短的音频。这在iOS上没有任何问题。我只是引用它(从媒体播放器)作为 现在的问题是Android。获取文件错误。未找到错误。查看LogCat(来自Android studio) 这条路变成了 /mnt/sdcard/files/default.m4a Android似乎无法处理像iOS这样的相对路径(奇怪的是,js应
/mnt/sdcard/files/default.m4a
Android似乎无法处理像iOS这样的相对路径(奇怪的是,js应用程序中的所有图像或模板都是相对路径,而且它们都工作得很好)
一直在上下搜索一个解决方案如何将一个音频文件复制到sd卡。到目前为止运气不好。问题是我无法正确找到原始文件的绝对路径。有很多例子是完全的BS。他们把路径硬编码进去了!Android可以是任何东西,在模拟器中是/mnt/sdcard/在我的测试设备上变成/external/sdcard0
而这正是来自(java):
我看到很多人都有同样的问题。但是现在的解决方案已经过时了。或者没有真正解决第一个问题(即首先找出原始文件的位置)。很多人都会面临一个问题,对吗
提前谢谢
另外,我也试过这个
this.getClass().getPackage().getName();
从onCreate方法内部调用。这只会让我走偏了路,而不是绝对的路
更新
以下是完整的工作代码(适用于PhoneGap 3.1)
试试这个:
public class testsample extends DroidGap {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// Set by <content src="index.html" /> in config.xml
CopyAssets();
super.setIntegerProperty("loadUrlTimeoutValue", 6000);
super.loadUrl(Config.getStartUrl());
}
private void CopyAssets() {
AssetManager assetManager = getAssets();
InputStream in = null;
OutputStream out = null;
try {
in = assetManager.open("www/img/logo.png"); // if files resides
// inside the "Files"
// directory itself
// "www/img/logo.png" is path of assets/www folder
out = new FileOutputStream(Environment
.getExternalStorageDirectory().toString()
+ "/"
+ "logo.png");
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);
}
}
}
公共类testsample扩展DroidGap{
@凌驾
创建时的公共void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
//在config.xml中设置
复制资产();
super.setIntegerProperty(“loadUrlTimeoutValue”,6000);
super.loadUrl(Config.getStartUrl());
}
私人资产(){
AssetManager AssetManager=getAssets();
InputStream in=null;
OutputStream out=null;
试一试{
in=assetManager.open(“www/img/logo.png”);//如果文件驻留
//在“文件”中
//目录本身
//“www/img/logo.png”是资产/www文件夹的路径
out=新文件输出流(环境)
.getExternalStorageDirectory().toString()
+ "/"
+“logo.png”);
复制文件(输入、输出);
in.close();
in=null;
out.flush();
out.close();
out=null;
}捕获(例外e){
Log.e(“tag”,e.getMessage());
}
}
私有void copyFile(输入流输入,输出流输出)引发IOException{
字节[]缓冲区=新字节[1024];
int-read;
while((read=in.read(buffer))!=-1){
输出。写入(缓冲区,0,读取);
}
}
}
别忘了在AndroidManifest.xml上添加权限
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
一个更干净的选项是安装org.apache.cordova.file-transfer插件,并从file:///android_asset/www/song.mp3“到/YourApp/song.mp3
cordova plugin add org.apache.cordova.file@1.1.0
cordova plugin add org.apache.cordova.file-transfer
然后:
// Assumes variable fileURL contains a valid URL to a path on the device,
// for example, cdvfile://localhost/persistent/path/to/downloads/
var fileTransfer = new FileTransfer();
var uri = encodeURI("http://some.server.com/download.php");
fileTransfer.download(
uri,
fileURL,
function(entry) {
console.log("download complete: " + entry.toURL());
},
function(error) {
console.log("download error source " + error.source);
console.log("download error target " + error.target);
console.log("upload error code" + error.code);
},
false,
{
//headers: {
// "Authorization": "Basic dGVzdHVzZXJuYW1lOnRlc3RwYXNzd29yZA=="
//}
}
);
更多信息请点击此处:
这样,您只需挥手来担心您的javascript谢谢它的工作。我会用完整的代码更新我的帖子。干杯
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
cordova plugin add org.apache.cordova.file@1.1.0
cordova plugin add org.apache.cordova.file-transfer
// Assumes variable fileURL contains a valid URL to a path on the device,
// for example, cdvfile://localhost/persistent/path/to/downloads/
var fileTransfer = new FileTransfer();
var uri = encodeURI("http://some.server.com/download.php");
fileTransfer.download(
uri,
fileURL,
function(entry) {
console.log("download complete: " + entry.toURL());
},
function(error) {
console.log("download error source " + error.source);
console.log("download error target " + error.target);
console.log("upload error code" + error.code);
},
false,
{
//headers: {
// "Authorization": "Basic dGVzdHVzZXJuYW1lOnRlc3RwYXNzd29yZA=="
//}
}
);