2

这是问题所在。我有一个应用程序可以将音频文件下载到手机然后播放。所有工作都没有问题。但小问题是 - 客户希望在下载其他文件时立即播放一些东西。

所以我在 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);
        }
    }
}
4

2 回答 2

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);
            }
        }
    }

不要忘记在 AndroidManifest.xml 上添加权限

    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
于 2013-11-11T09:18:47.963 回答
0

更简洁的选择是安装 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=="
        //}
    }
);

更多信息在这里: https ://github.com/apache/cordova-plugin-file-transfer/blob/master/doc/index.md

这样你只需挥手担心你的 javascript

于 2014-07-16T11:27:58.443 回答