javame - 下载并保存mp3文件

时间:2013-02-16 13:20:19

标签: java java-me

我有一个javame项目,我试图创建一个方法来下载和保存MP3文件到手机。该方法如下所示,遗憾的是它不断抛出java.lang.illegalargument异常。

    public void Download_KeyTest()
    {
        FileConnection file = null;
        OutputStream outStream = null;
        String resumeJSON = mPreferences.get("resume");
        JSONObject resumeObject;
        try {
            resumeObject = new JSONObject(resumeJSON);
            String key=resumeObject.get("code").toString();
            String inputStr=getTextField12().getString();
            if (inputStr.equals(key))
            {
            Enumeration roots = FileSystemRegistry.listRoots();
            String currentRoot = null;
            while (roots.hasMoreElements()) {
                currentRoot = (String) roots.nextElement();
                System.out.println(currentRoot);
                }
            HttpConnection hc = null;
            DataInputStream in = null;
            try {
            String url = d_url+resumeObject.getJSONObject("sObject").get("loc").toString();
            String sname = urlEncode(resumeObject.getJSONObject("sObject").getString("name").toString());
            hc = (HttpConnection)Connector.open(url);
            int length = (int)hc.getLength();
            byte[] data = null;
            if (length != -1) {
                switchDisplayable(null,getWaitScreen1());
                data = new byte[length];
                in = new DataInputStream(hc.openInputStream());
                in.readFully(data);
                }
                else {
                // If content length is not given, read in chunks.
                switchDisplayable(null,getWaitScreen1());
                int chunkSize = 512;
                int index = 0;
                int readLength = 0;
                in = new DataInputStream(hc.openInputStream());
                data = new byte[chunkSize];
                do {
                    if (data.length < index + chunkSize) {
                    byte[] newData = new byte[index + chunkSize];
                    System.arraycopy(data, 0, newData, 0, data.length);
                    data = newData;
                    }
                    readLength = in.read(data, index, chunkSize);
                    index += readLength;
                } while (readLength == chunkSize);
            length = index;
            }
            getWaitScreen1().setText("Download Complete");
try {
            // Get path to photos folder.
            String dirMusic = System.getProperty("fileconn.dir.memorycard.music");
            if(dirMusic == null) {
                dirMusic=currentRoot;
                //throw new Exception("Unable get music folder name");
            }

            String fileName = dirMusic + sname +".mp3";
            // Open file
            file = (FileConnection)Connector.open(fileName, 
                    Connector.READ_WRITE);
            // If there is no file then create it
            if(file.exists() == false) {
                file.create();
            }
            // Write data received from camera while making snapshot to file
            outStream = file.openOutputStream();
            outStream.write(data);
            System.out.println(file.availableSize());
            //file.setHidden(false);

            getWaitScreen1().setText("Song saved to music folder.");

        } catch(IOException ioe) {
           Alert alertx = new Alert("IO error", ioe.toString(), null, AlertType.ERROR);
           alertx.setTimeout(Alert.FOREVER);
           switchDisplayable(alertx,getDownloadVerifyKeyForm());
        } catch(Exception exc) {
           Alert alertx = new Alert("Error", exc.toString()+exc.getMessage(), null, AlertType.ERROR);
           exc.printStackTrace();
           alertx.setTimeout(Alert.FOREVER);
           switchDisplayable(alertx,getDownloadVerifyKeyForm());
        } finally {
            // Try to close file
            try {
                if(outStream != null) {
                    outStream.close();
                }
                if(file != null) {
                    file.close();
                }
            } catch(Exception exc) {
                // Do nothing 
                exc.printStackTrace();
            }
        }            
        }
        catch (Exception ex)
        {
        ex.printStackTrace();    
        }
            }
        } catch (Exception ex)
        {
        ex.printStackTrace();    
        }
    }

这是我得到的错误

java.lang.IllegalArgumentException
    at javax.microedition.io.Connector.getProtocolInstance(), bci=28
    at javax.microedition.io.Connector.open(), bci=24
    at javax.microedition.io.Connector.open(), bci=3
 - spinapp.SpinApp.Download_KeyTest(SpinApp.java:703)

第703行是代码

hc = (HttpConnection)Connector.open(url);

1 个答案:

答案 0 :(得分:2)

如果网址无效,

Connector.open(String)会抛出IllegalArgumentException,因此我们真正需要看到的是您传入的完全网址。

由于Stack Overflow注释格式的工作方式,有点难以分辨出哪个URL。为了将来参考,如果您想将确切的网址粘贴到评论中,请将其格式化为代码,并在其周围添加单个刻度标记。因此,如果您的url变量是否包含协议前缀,则有点难以判断。

但是,您的完整网址应该是

http://127.0.0.1/relief/api/uploads/p17gnmso5duql0lnhevja15td5.mp3

显然,在测试网址时,通常将网址粘贴到桌面浏览器中是个好主意,并确保它也能在那里工作。此URL(host = 127.0.0.1)表示您在与模拟器相同的计算机上运行服务器。

(这提出了另一点......你说这是针对你的问题中的手机,但127.0.0.1服务器地址只有在你运行时才会起作用在模拟器中)


再次查看您的评论后,

修改,我想知道此行上是否没有发生异常:

     file = (FileConnection)Connector.open(fileName, 
                Connector.READ_WRITE);

如果fileName等于root1/bogolako.mp3,那么 会错过该调用的协议。您应该在fileName前加"file:///"前缀,假设"/root1/"实际上是模拟器上的有效绝对路径。

See here for a J2ME file connection example