0

我正在尝试在 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;
    }
}

它本身似乎工作,例如不会崩溃。我进入 Bitmapphoto变量。然后我使用 ByteArrayOutputStream 压缩它,它变成大约 5103 字节(在缓冲区中)。然后我将其转换为 char 数组(以便可以发送),char 数组变为 4758 个元素。不知道为什么会这样(可能是这条线char [] dataAsChar = new String(data).toCharArray();)。当然,一旦图像转移到另一边,它就会损坏。

我在这里想念什么?

编辑。根据@digitalJoel 的建议,我放弃了 OutputStreamWriter 并替换为

OutputStream os = conn.getOutputStream();
os.write(data);
4

2 回答 2

2

new String(bitmapData ).toCharArray()对我来说似乎是一个非常糟糕的主意。我认为您不能期望 JPEG 中的所有字节都被塞入一个字符串中而不会发生一些损坏。那么,为什么不直接将字节写入 OutputStream 而不是将其包装在 OutputStreamWriter 中呢?

于 2012-06-04T18:48:43.833 回答
1

当您创建从中获取 char 数组的 String 时,您没有指定编码方法。Android 的默认字符串编码方法可以将多个原始字节转换为单个逻辑字符吗?

即使不是,这种事情就是为什么(正如@digitaljoel 所说)构建一个字符串只是为了获得一个字符数组并不是最好的主意。

于 2012-06-04T18:52:29.450 回答