如何将文件转换为byte [] Array以通过Android中的蓝牙插槽发送?

时间:2011-12-23 10:01:46

标签: android

美好的一天,我有一个要求,我需要通过蓝牙插座连接发送文件(图像/视频..等)。我使用SDK中的蓝牙聊天示例作为指导。我可以成功连接,但是无法将SD卡中的文件转换为字节数组,因此我可以通过outputStream来编写它。

我可以使用以下代码转换图像:

//After getting the imageId from the cursor object
 Bitmap bitmap = Media.getBitmap(getContentResolver(), imageUri);
ByteArrayOutputStream baos = new ByteArrayOutputStream();

bitmap.compress(Bitmap.CompressFormat.JPEG, 90, baos);
bytes[] bytes = baos.toByteArray();

但是在转换视频或其他文件时遇到问题,我是否应该使用ObjectOutputStream进行所有转换,还是有另外一种方法可以执行此操作,因为我似乎无法将fileOutputStream转换为字节数组?谢谢

5 个答案:

答案 0 :(得分:4)

使用getContentResolver().openInputStream(uri)从URI获取InputStream。然后从输入流中读取数据,将数据从该输入流转换为byte []

尝试使用以下代码

public byte[] readBytes(Uri uri) throws IOException {
          // this dynamically extends to take the bytes you read
        InputStream inputStream = getContentResolver().openInputStream(uri);
          ByteArrayOutputStream byteBuffer = new ByteArrayOutputStream();

          // this is storage overwritten on each iteration with bytes
          int bufferSize = 1024;
          byte[] buffer = new byte[bufferSize];

          // we need to know how may bytes were read to write them to the byteBuffer
          int len = 0;
          while ((len = inputStream.read(buffer)) != -1) {
            byteBuffer.write(buffer, 0, len);
          }

          // and then we can return your byte array.
          return byteBuffer.toByteArray();
        }

答案 1 :(得分:2)

视频通常很大,因此可能无法将其完全存储在内存中。这意味着你不应该将视频转换为巨大的字节[]。相反,你需要一个固定大小的byte []作为缓冲区。您将逐段加载视频文件到该缓冲区中并使用不同的数据反复发送。

答案 2 :(得分:1)

要扩展前两个答案,您最终可能会得到以下结果:

void sendFile(Uri uri, BluetoothSocket bs) throws IOException
{
    try
    {
        BufferedInputStream bis = new BufferedInputStream(getContentResolver().openInputStream(uri));
        OutputStream os = bs.getOutputStream();
        int bufferSize = 1024;
        byte[] buffer = new byte[bufferSize];

        // we need to know how may bytes were read to write them to the byteBuffer
        int len = 0;
        while ((len = inputStream.read(buffer)) != -1)
        {
            os.write(buffer, 0, len);
        }
    }
    finally
    {
        if(bis != null)
            bis.close();
    }
}

您可以调用此方法传递文件的Uri和您的文件需要发送到的BluetoothSocket。然后,此方法将读取给定文件并将其发送到指定的套接字。如果在通信期间发生错误,它将抛出IOException

答案 3 :(得分:0)

要像这样:

   InputStream in = null;
   try {
     in = new BufferedInputStream(new FileInputStream(file));

    finally {
     if (in != null) {
       in.close();
     }
   }

然后使用这里提出的方法: http://www.java2s.com/Code/Android/File/InputStreamtobytearraycopyReaderandWriter.htm

答案 4 :(得分:0)

这可能是一个迟到的回复,但我最近尝试做同样的事情,最终导致内存不足错误。我的另一种方法是逐帧读取文件(使用Bitmap类)。然后我将每个帧转换为字节数组。这允许我逐帧发送文件