当前位置: 首页 > 面试题库 >

通过蓝牙将图像从android发送到PC

顾亦
2023-03-14
问题内容

我正在制作一个应用程序,用于将图像从Android设备发送到在PC上运行的Java应用程序。客户端(android)上的图片是Bitmap,我将其转换为Byte Array,以便通过蓝牙发送到服务器

 ByteArrayOutputStream baos = new ByteArrayOutputStream();  
 ImageBitmap.compress(Bitmap.CompressFormat.JPEG, 100, baos);     
 byte[] b = baos.toByteArray();
 mBluetoothService.write(b);

请注意,位图来自已压缩的文件,因此我不需要再次对其进行压缩。

我在服务器(Java)上使用以下代码:

  byte[] buffer = new byte[1024*1024];
  int bytes;
  bytes = inputStream.read(buffer);
  ByteArrayInputStream bais = new ByteArrayInputStream(buffer);
  BufferedImage image = ImageIO.read(bais);
  ImageIO.write(image, "jpg", new File("c:/users/image.jpg"));

客户端没有错误。但是我在服务器端(Java应用程序)遇到此异常:

java.lang.IllegalArgumentException:im == null!

在javax.imageio.ImageIO.write(未知来源)

在javax.imageio.ImageIO.write(未知来源)

在com.luugiathuy.apps.remotebluetooth.ProcessConnectionThread.run(ProcessConnectionThread.java:68)

在java.lang.Thread.run(未知来源)

因此,该工具ImageIO.read()不会返回任何内容。似乎无法将字节数组识别为图像。我已经在互联网上进行搜索,但是没有什么可以帮助我解决这个问题。有人有什么主意吗?

非常感谢!!


问题答案:

我终于可以弄清楚了!碰巧,客户端(Android)创建了一个用于接收的线程和一个用于写入的线程。因此,当我发送图像时,它是成块发送的,即Android
OS会不时暂停写入线程,因此服务器端(Java应用程序)上的inputStream看到图像是成块的。因此,ImageIO.read()不是成功读取图像而是读取图像的一部分,这就是为什么我得到“
java.lang.IllegalArgumentException:im == null!”的原因,因为仅凭一个块就无法创建任何图像。

解:

除了图像之外,我还向服务器发送了“文件结束”字符串,因此它知道文件何时完成(我想对此有更好的方法,但这是可行的)。在服务器端,在while循环中,我接收所有字节块并将它们全部放在一起,直到接收到“文件末尾”。代码:

Android客户端:

    ByteArrayOutputStream baos = new ByteArrayOutputStream();
    ImageBitmap.compress(Bitmap.CompressFormat.JPEG, 100, baos);     
    byte[] b = baos.toByteArray();
    mBluetoothService.write(b);
    mBluetoothService.write("end of file".getBytes());

Java服务器:

    byte[] buffer = new byte[1024];

    File f = new File("c:/users/temp.jpg");
    FileOutputStream fos = new FileOutputStream (f);

    int bytes = 0;
    boolean eof = false;

    while (!eof) {

        bytes = inputStream.read(buffer);
        int offset = bytes - 11;
        byte[] eofByte = new byte[11];
        eofByte = Arrays.copyOfRange(buffer, offset, bytes);
        String message = new String(eofByte, 0, 11);

        if(message.equals("end of file")) {

            eof = true;

        } else {

            fos.write (buffer, 0, bytes);

        }

    }
    fos.close();

希望它能帮助到别人。



 类似资料:
  • 我写了一个通过蓝牙发送/接收文件的应用程序,但我想把这个应用程序设置为默认的应用程序发送和接收文件! 移动设备向我的手机发送文件时的说明;我的应用程序获取文件,并与它一起工作之后,保存在我想要的时间和地点。

  • 我正在尝试在android设备中通过蓝牙发送文件。我做了发现,连接,并做了一个蓝牙插座。问题是当我在蓝牙套接字的输出流中写入字节数组时,接收方没有接收到任何东西,尽管它接受正在发送的东西。

  • 当arduino连接到USB时,我的串行端口是/dev/ttyacm0。这个很管用。然而,当蓝牙适配器连接时,我收到错误“程序员没有响应”。我无法识别bluetooth在哪个端口上运行。我试着列举串行端口,但我找不到有没有蓝牙适配器的区别。你知道在哪里可以找到适合蓝牙通信的串行端口名称吗?

  • 我想知道我们是否可以将2个蓝牙设备连接到Android设备,并在Android中实时共享数据?i、 e我有一个传感器连接到Android设备,我想流式传输或收听或广播从传感器接收到的数据到耳机(连接到同一个Android设备)。在Android中可能吗??请提出建议。提前谢谢。 我想通过经典蓝牙收听音频流。有可能把Android设备变成接收器吗?目前,我们使用HFP模式和经典蓝牙进行通信。 场景:

  • 我制作了一个android应用程序来扫描蓝牙设备,并向我的服务器发送一个HTTP请求,这样我就可以检测它们是开着还是关着。我已经用我的带有蓝牙适配器的台式电脑测试过了,效果很好。当检测到电脑上的蓝牙功能时,它显示电脑是打开的,当我关闭电脑上的蓝牙功能时,它是关闭的。现在,我需要使用这个应用程序的设备有:雅伯投影仪、Bose SoundLink和JBL耳机,但我遇到了一些问题。 首先,投影仪似乎无法