0

Android アプリで写真を撮り、JPEG に変換してから Web サービスにアップロードしようとしています。これまでのところ、次のものが得られました。

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 からのすべてのバイトが文字列に押し込まれることを期待できるとは思いません。では、バイトを OutputStreamWriter にラップするのではなく、単に OutputStream に書き込んでみませんか?

于 2012-06-04T18:48:43.833 に答える
1

char 配列を取得する String を作成するときに、エンコード方法を指定していません。Android のデフォルトの文字列エンコーディング メソッドは、複数の raw バイトを単一の論理文字に変換できますか?

そうでない場合でも、そのようなことが (@digitaljoel が言うように) 文字配列を取得するためだけに String を構築することが最善のアイデアではない理由です。

于 2012-06-04T18:52:29.450 に答える