如何从J2ME中的platformRequest()获取信息/数据?

时间:2012-09-28 08:17:32

标签: java-me nokia midp midlet

我想实现类似于Whatsapp的行为,用户可以上传图像。我尝试在我的应用程序中打开图像,但如果图像太大,我将出现内存不足错误。

要解决此问题,我正在使用platformRequest()方法打开要在手机原生图像查看器中打开的图像。

但是,我想知道Whatsapp如何修改手机的原生图像查看器以添加“选择”按钮,用户可以使用该按钮选择要上传的图像。如何将该信息发送回J2ME应用程序以及如何调整图像大小?


编辑: 我用两种不同的方式试了这个,这两种方式都给了我OOME。

起初,我尝试了更直接的方法:

FileConnection fc = (FileConnection) Connector.open("file://localhost/" + currDirName + fileName);
if (!fc.exists()) {
    throw new IOException("File does not exists");
}
InputStream fis = fc.openInputStream();
Image im = Image.createImage(fis);
fis.close();

当这不起作用时,我尝试了一种更“手动”的方法,但这也给了我一个错误。

FileConnection fc = (FileConnection) Connector.open("file://localhost/" + currDirName + fileName);
if (!fc.exists()) {
    throw new IOException("File does not exists");
}
InputStream fis = fc.openInputStream();

ByteArrayOutputStream file = new ByteArrayOutputStream();
int c;

byte[] data = new byte[1024];

while ((c = fis.read(data)) != -1) {
    file.write(data, 0, c);

}

byte[] fileData = null;
fileData = file.toByteArray();

fis.close();
fc.close();
file.close();
Image im = Image.createImage(fileData, 0, fileData.length);

当我调用createImage方法时,两种情况都会发生内存不足错误。 这随设备而变化。 E72给出了3MB图像的错误,而较新的设备会给出错误,图像大于10MB。

1 个答案:

答案 0 :(得分:1)

MIDP 2(JSR 118)没有API,你需要找到另一种处理大图像的方法。

至于WhatsApp,看起来他们不依赖MIDP来支持这项功能。如果您检查Wikipedia page,您会注意到他们并未将普通Java ME声称为支持平台,而是列出较窄的平台,如Symbian,S40,Blackberry等。

这很可能意味着他们实现了“有问题的功能”,就像您要求使用特定目标设备的特定于平台的API一样,对于列出的每个平台都有基本独立的项目/版本。

如果您的应用程序中确实需要此功能,则可能需要执行此类操作。

在这种情况下,请考虑以某种方式封装有问题的功能,以便在为不同平台构建源代码时更轻松地切换部分源代码。例如,Class.forName(String)可用于根据目标平台加载特定于平台的实现。

//...
Image getImage(String resourceName) {
   // ImageUtil is an interface with method getImage
   ImageUtil imageUtil = (ImageUtil) Class.forName(
           // get platform-specific implementation, eg
           //   "mypackage.platformspecific.s40.S40ImageUtil"
           //   "mypackage.platformspecific.bb.BBImageUtil"
           //   "mypackage.platformspecific.symbian.SymbialImageUtil"
           "mypackage.platformspecific.s40.S40ImageUtil");
   return imageUtil.getImage(resourceName);
}
//...