2012-09-28 8 views
1

我想实现类似于Whatsapp的行为,用户可以上传图片。我试图在我的应用程序中打开图像,但如果图像太大,则会出现内存不足错误。如何从J2ME的platformRequest()获取信息/数据?

为了解决这个问题,我使用platformRequest()方法打开转发要在手机的本机图像查看器中打开的图像。

但是,我想知道它是如何修改手机的本机图像查看器,添加一个“选择”按钮,用户选择他想要上传的图像。这些信息如何发送回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图像,而一个新的设备会给我错误的图像大于10MBs。

+1

你测试过[WhatsApp](http://en.wikipedia.org/wiki/WhatsApp)如何处理大图片吗?此外,您是否考虑过在服务器上调整图像大小的选项,_before_发送至手机? – gnat

+1

我已经在服务器端调整大小,但问题是,如果发送用户试图打开一个大图像,以便他可以将其发送到服务器,应用程序崩溃内存不足。我在WhatsApp中测试了相同的图像,也测试了相同的图像,并且没有人提出这个问题。 –

+0

有趣。请编辑答案,以显示您在用户打开图像时使用的代码 - 您获得OOME的代码。从我在wikipedia上看到的看起来,他们可能会使用Symbian特定的API,而不是通用的Java ME MIDP – gnat

回答

1

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

至于WhatsApp,看起来他们不依赖于MIDP来支持这个功能。如果您检查Wikipedia page你会注意到,他们不要求一般的Java ME所支持的平台,而是列出一样的Symbian,S40,黑莓等平台的窄

这很可能意味着它们实现“有问题的功能“就像你在询问有关使用特定目标设备的特定于平台的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); 
} 
//...