我有一个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);
答案 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/"
实际上是模拟器上的有效绝对路径。