1

我想实现类似于 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 的图像错误。

4

1 回答 1

1

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

至于 WhatsApp,看起来他们不依赖 MIDP 来支持此功能。如果您查看Wikipedia 页面,您会注意到他们并没有声称通用 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);
}
//...
于 2012-09-29T13:24:55.563 回答