javame-在上下载并保存mp3文件



我有一个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);

如果URL无效,Connector.open(String)将抛出IllegalArgumentException,所以我们真正需要看到的是您传递的确切的URL。

由于Stack Overflow注释格式的工作方式,很难判断是哪个URL。为了将来参考,如果您想在注释中粘贴一个确切的URL,请将其格式化为代码,并在其周围加上一个勾号。因此,很难判断您的url变量是否包含协议前缀。

但是,你的完整URL应该是

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

显然,在测试URL时,通常将URL粘贴到桌面浏览器中是个好主意,并确保它也能在那里工作。这个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/"实际上是模拟器上的一个有效绝对路径。

请参阅此处获取J2ME文件连接示例

最新更新