我正在尝试在Android应用中拍照,将其转换为JPEG,然后将其上传到网络服务。到目前为止,我得到了以下内容:
private static final int CAMERA_REQUEST = 1888;
private void TakePhoto() {
Intent cameraIntent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
startActivityForResult(cameraIntent, CAMERA_REQUEST);
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
switch (requestCode) {
case CAMERA_REQUEST:
Bitmap photo = (Bitmap) data.getExtras().get("data");
ByteArrayOutputStream bos = new ByteArrayOutputStream();
photo.compress(Bitmap.CompressFormat.JPEG, 90, bos);
byte [] bitmapData = bos.toByteArray();
char [] dataAsChar = new String(bitmapData ).toCharArray();
URL url = new URL("http://www.foo.com/bar);
URLConnection conn = url.openConnection();
conn.setDoOutput(true);
conn.setRequestProperty("Content-Type", "application/octet-stream");
OutputStreamWriter wr = new OutputStreamWriter(conn.getOutputStream());
wr.write(dataAsChar);
wr.flush();
// Get the response
BufferedReader rd = new BufferedReader(new InputStreamReader(conn.getInputStream()));
String line;
while ((line = rd.readLine()) != null) {
// Process line...
}
wr.close();
rd.close();
break;
}
}
它本身似乎有用,例如没有崩溃。我进入了Bitmap photo
变量。然后我使用ByteArrayOutputStream压缩它,它变成大约5103字节(在缓冲区中)。然后我将它转换为char数组(以便可以发送),char数组变为4758个元素。不知道为什么会这样(可能是这一行char [] dataAsChar = new String(data).toCharArray();
)。当然,一旦图像转移到另一边,它就会被破坏。
我在这里缺少什么?
EDIT。根据@digitalJoel的建议,我放弃了OutputStreamWriter并替换为
OutputStream os = conn.getOutputStream();
os.write(data);
答案 0 :(得分:2)
new String(bitmapData ).toCharArray()
对我来说似乎是一个非常糟糕的主意。我不认为你可以期望JPEG中的所有字节都被塞进一个字符串而不会发生一些损坏。那么,为什么不将字节写入OutputStream而不是将其包装在OutputStreamWriter中呢?
答案 1 :(得分:1)
当您创建从中获取char数组的String时,您没有指定编码方法。 Android的默认字符串编码方法可以将多个原始字节转换为单个逻辑字符吗?
即使没有,这就是为什么(正如@digitaljoel所说)为了得到一个字符数组而构建一个字符串并不是最好的主意。