美好的一天,我有一个要求,我需要通过蓝牙插座连接发送文件(图像/视频..等)。我使用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转换为字节数组?谢谢
答案 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类)。然后我将每个帧转换为字节数组。这允许我逐帧发送文件