合并通过蓝牙传输的数据[]

Merging byte[] that was transfered through bluetooth

所以,我使用 this Android 示例作为指导,在没有任何验证的情况下建立蓝牙连接(此应用程序的用户群非常有限,无法在商店)。

我能够很好地传输字符串,而且效果很好。我的问题是在尝试传输图像时。

我有一个 activity 将图像的字节 [] 发送到蓝牙服务,另一个 activity 的处理程序接收消息并对所述消息进行处理。

事实是,由于缓冲区的大小,处理程序接收原始字节 [] 的部分内容。我要做的是将所有部分合并为一个字节并保存。

这是我在处理程序中执行的循环:

byte[] result = new byte[originalByteSize];
byte[] readBuf = (byte[]) msg.obj;

if (cont < byteTimes){
    if (result == null) {
        result = appendData(readBuf,readBuf);
    } else {
        result = appendData(result,readBuf);         
    }
} else {
    new SavePhotoTask(cont).execute(result);
}

这是 appendData 函数

protected byte[] appendData(byte[] firstObject,byte[] secondObject){
    ByteArrayOutputStream outputStream = new ByteArrayOutputStream( );
    try {
        if (firstObject!=null && firstObject.length!=0)
            outputStream.write(firstObject);
        if (secondObject!=null && secondObject.length!=0)
            outputStream.write(secondObject);
    } catch (IOException e) {
        e.printStackTrace();
    }
    return outputStream.toByteArray();
}

这里是我写文件的地方:

    public class SavePhotoTask extends AsyncTask<byte[], String, String> {

    int counter = 0;

    public SavePhotoTask(int cont){
        this.counter = cont;
    }

    @Override
    protected String doInBackground(byte[]... jpeg) {
        File photo = new File(Environment.getExternalStorageDirectory(), counter + "_photo.jpg");

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

        try {
            FileOutputStream fos = new FileOutputStream(photo.getPath());

            fos.write(jpeg[0]);
            fos.close();
        } catch (java.io.IOException e) {
            Log.e("PictureDemo", "Exception in photoCallback", e);
        }

        return (null);
    }

我需要的只是正确方向的提示,谢谢。

我用这个 answer

解决了我的问题

问题出在我写入和读取流的方式上。

public static void writeItem(OutputStream out, String s) throws IOException
{
    // Get the array of bytes for the string item:
    byte[] bs = s.getBytes(); // as bytes
    // Encapsulate by sending first the total length on 4 bytes :
    //   - bits 7..0 of length
    out.write(bs.length);      // modulo 256 done by write method
    //   - bits 15..8 of length
    out.write(bs.length>>>8);  // modulo 256 done by write method
    //   - bits 23..16 of length
    out.write(bs.length>>>16); // modulo 256 done by write method
    //   - bits 31..24 of length
    out.write(bs.length>>>24); // modulo 256 done by write method
    // Write the array content now:
    out.write(bs); // Send the bytes
    out.flush();
}

public static String readItem(InputStream in) throws IOException
{
    // first, read the total length on 4 bytes
    //  - if first byte is missing, end of stream reached
    int len = in.read(); // 1 byte
    if (len<0) throw new IOException("end of stream");
    //  - the other 3 bytes of length are mandatory
    for(int i=1;i<4;i++) // need 3 more bytes:
    {
        int n = in.read();
        if (n<0) throw new IOException("partial data");
        len |= n << (i<<3); // shift by 8,16,24
    }
    // Create the array to receive len bytes:
    byte[] bs = new byte[len];
    // Read the len bytes into the created array
    int ofs = 0;
    while (len>0) // while there is some byte to read
    {
        int n = in.read(bs, ofs, len); // number of bytes actually read
        if (n<0) throw new IOException("partial data");
        ofs += n; // update offset
        len -= n; // update remaining number of bytes to read
    }
    // Transform bytes into String item:
    return new String(bs);
}