1

私は、Bluetooth機能を実装する必要がある Android アプリケーションに取り組んでいます。外部ハードウェア デバイスからイメージを受信し、そのバイト配列をイメージ ファイルとして SD カードに保存する必要があります。

これが私のコードです:

public void run(){
                Log.i(TAG, "BEGIN mConnectedThread");
                byte[] buffer = new byte[4096];

            //CREATE IMAGE FILE
            File test=new File(Environment.getExternalStorageDirectory(), "test.jpg");

            if (test.exists()) {
                test.delete();
            }

            try {
                fos = new FileOutputStream(test.getPath());
            } catch (FileNotFoundException e1) {
                // TODO Auto-generated catch block
                e1.printStackTrace();
            }


            // Keep listening to the InputStream while connected
            while (true) {
                try {
                    // Read from the InputStream
                    bytes = mmInStream.read(buffer);

                    /*mEmulatorView.write(buffer, bytes);
                    // Send the obtained bytes to the UI Activity
                    mHandler.obtainMessage(BlueTerm.MESSAGE_READ, bytes, -1, buffer).sendToTarget();*/
                    //receivedData = new String(buffer);

                    receivedData=new String(buffer)

                        //WRITE BYTES TO FILE
                        try {

                            fos.write(buffer);

                        }
                        catch (java.io.IOException e) {
                            Log.e("PictureDemo", "Exception in photoCallback", e);
                        }

                        /*
                        Bitmap bitmap = null;
                        try {
                            bitmap = BitmapFactory.decodeByteArray(buffer , 0, buffer.length);
                        } catch (OutOfMemoryError e) {
                            e.printStackTrace();
                        }catch (Exception e) {
                            e.printStackTrace();
                        }
                        if(bitmap != null)

                                testModeOnScreen.saveBitmapToSdcardAndEmail(bytes, bitmap);
                         */}

                } catch (IOException e) {
                    Log.e(TAG, "disconnected", e);
                    connectionLost();
                    break;
                }
            }
            try {
                fos.close();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            }

私の問題は、例外やクラッシュが発生しないことですが、画像ファイルが破損しています。

4

2 に答える 2

1

ここには複数の問題があるようです。手始めに、バッファ末尾のガベージ「k を実際に読み取ったバイト数とします。これらのバイトは要素 b[0] から b[k-1] に格納され、要素 b[k] から b[b.長さ-1] 影響を受けない":

http://docs.oracle.com/javase/6/docs/api/java/io/InputStream.html#read()

また、Android のビットマップ機能を使用する必要がある場合もあります。

ここでビットマップを交換する方法を見てください。

http://kamrana.wordpress.com/2012/05/12/sending-images-over-bluetooth-in-android/

そして、ファイルに保存する方法:

ビットマップをファイルに保存する機能

http://developer.android.com/reference/android/graphics/Bitmap.html#compress(android.graphics.Bitmap.CompressFormat, int, java.io.OutputStream)

これらの構成要素を再発明するよりも、これらの構成要素をハッキングする方が簡単であることがわかります。

于 2012-12-29T11:11:19.993 に答える