从内存打开PNG文件并通过TCP套接字发送

时间:2018-08-31 13:47:44

标签: android inputstream android-storage

我希望将图像从我的android设备发送到运行python的计算机/树莓派。我已经使用以下代码从Windows笔记本电脑(运行Java客户端)实现了通信。

BufferedImage image = ImageIO.read (new File("C:/Users/****/OneDrive/Pictures/Om-nom.png"));
s = new Socket("192.168.2.69",8000);
ImageIO.write(image, "png", s.getOutputStream());
s.close();

但是,Android不支持BufferedImage库(java.awt.image)。如何在android studio中实现在Android设备上运行的类似功能,即从设备内存中读取PNG文件到字节缓冲区,然后将其发送到服务器PC。

  

注意:我文件的位置类似于以下 /storage/emulated/0/Downloads/frog-face_1f438.png

2 个答案:

答案 0 :(得分:1)

要获取图像,您可以执行以下操作:

    // TODO check sdcard is available
    File directory = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS);
    File photoPath = new File(directory, "temp.jpg");

    BitmapFactory.Options options = new BitmapFactory.Options();
    options.inPreferredConfig = Bitmap.Config.ARGB_8888;
    final Bitmap bitmap = BitmapFactory.decodeFile(photoPath.getAbsolutePath(), options);

要发送到服务器,您可以使用okHttp客户端,或者使用哪种协议与服务器进行通信。

更新: 在清单中,您应该指出此权限

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

如果您在android 6及更高版本上运行代码,则应处理运行时权限(WRITE_EXTERNAL_STORAGE):

List of Android permissions normal permissions and dangerous permissions in API 23?

// oncreate method or whereever you want to call your code 
        if (ContextCompat.checkSelfPermission(this, 
                Manifest.permission.WRITE_EXTERNAL_STORAGE)
                != PackageManager.PERMISSION_GRANTED) {
            ActivityCompat.requestPermissions(this,
                    new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},
                    STATUS_CODE);
        } else {
            // TODO run your code
        }


@Override
public void onRequestPermissionsResult(int requestCode,
                                       String permissions[], int[] grantResults) {
    switch (requestCode) {
        case STATUS_CODE: {
            // If request is cancelled, the result arrays are empty.
            if (grantResults.length > 0
                    && grantResults[0] == PackageManager.PERMISSION_GRANTED) {

                // TODO run your code
            } else {
                // TODO show warning
            }

答案 1 :(得分:0)

感谢您对Gleichmut的帮助。如果有人需要在他们的应用中需要类似的功能(通过TCP套接字发送图像),我已经设法编写了一些在GitHub上可用的工作代码。

此处的GitHub存储库:https://github.com/Lime-Parallelogram/Sending-Images-Through-Sockets-Android-to-Python-

  

注意:我在GitHub上的代码包括一个python服务器和一个旨在在android上运行的java客户端-用Android-Studio编写