Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java PhoneGap 3.1 Android将音频文件从www文件夹复制到SD卡_Java_Android_Audio_Cordova_Media - Fatal编程技术网

Java PhoneGap 3.1 Android将音频文件从www文件夹复制到SD卡

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应

问题就在这里。我有一个应用程序,可以将音频文件下载到手机上,然后播放。一切顺利。但小问题是——客户希望在下载其他文件时能够直接播放

所以我在www/files/文件夹中放了一段简短的音频。这在iOS上没有任何问题。我只是引用它(从媒体播放器)作为

现在的问题是Android。获取文件错误。未找到错误。查看LogCat(来自Android studio)

这条路变成了

 /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=="
        //}
    }
);