【问题标题】:Android File transfer including Exif dataAndroid 文件传输,包括 Exif 数据
【发布时间】:2016-12-01 17:00:28
【问题描述】:

我正在尝试通过套接字将一些图像文件从安卓手机传输到服务器。到目前为止,我发现在 android 上执行此操作的唯一方法是使用 FileInputStream 将图像作为字节数组读取并通过套接字发送以在服务器端重建。这很好用,不幸的是,Android(或java?)不允许元数据(在我的情况下为exif数据)包含在FileInputStream中。这意味着一旦图像在服务器上,我的 exif 数据就会丢失。

我尝试使用 ExifInterface(它似乎无法读取我需要的大量 exif 数据)和 Metadata library 来解决这个问题。元数据库似乎确实获得了我想要的所有 exif 数据,但我不知道如何将其写为可以通过我的流发送的字节,它只有一个 toString 可以摆脱一些需要的数据被转移。

理想情况下,我希望有一种方法来传输带有元数据的文件,但是我很高兴有一种方法可以将元数据标签转换为可以添加到套接字输出流中的字节。

这是通过套接字上传文件的代码

FileInputStream in = new FileInputStream(lastSavedPath); byte[] buffer = new byte[1024]; int length = 0; while ((length = in.read(buffer, 0, buffer.length)) != -1){ outputStream.write(buffer, 0, length); } ExifInterface exifInterface = new ExifInterface(lastSavedPath); Metadata metadata = ImageMetadataReader.readMetadata(new File(lastSavedPath)); for (Directory directory : metadata.getDirectories()){ for (Tag tag : directory.getTags()){ Log.d("Socket Listener", tag.toString()); if (tag.toString().indexOf("Exif")>=0) Log.d("Socket exif", "Data"+exifInterface.getAttribute(tag.getTagName())); } } outputStream.flush(); Log.d("Socket Listener", "Data has been sent"); in.close(); socket.close();

【问题讨论】:

  • 您的问题不清楚。 FileInputStream 只是逐字节读取文件。如果在服务器端缺少 Exif 数据,则它们未包含在您已阅读的文件中。可能是你读错了文件?请编辑您的问题并包含相关的代码示例和更多详细信息。
  • android api 不允许从流stackoverflow.com/questions/12944123/… 中读取元数据。我可以确认这些文件确实有 exif 数据,因为我已经通过 adb 下载它们来检查它们。
  • 恕我直言,目前还不清楚您想要实现什么以及应该在哪里完成(Android 或服务器端)。
  • 我不确定哪一部分不清楚。我在包含元数据的 android 手机上有图像。我需要将这些图像与附加的元数据一起传输到服务器。我当然愿意接受任何方式来做到这一点,但考虑到 android 是如何被锁定的,在我看来,发送必须在手机上进行。我不能用 FileInputStream 做到这一点,因为这个类的 android 实现按设计排除了元数据。
  • 对于普通的 JPEG 图像,文件数据已经包含 Exif 元数据 - 您只是缺少在 Android 中读取它的方法。因此,我不明白您要做什么。只需将 JPEG 文件数据发送到服务器并在那里提取 exif 信息。无需单独转移。

标签: java android sockets metadata fileinputstream


【解决方案1】:

这里的问题根本不在于 android。我在另一个线程中读到 android FileInputStream 不包含元数据,但事实并非如此。我相信现在问题出在我的服务器端代码中。我已经用以下代码解决了这个问题:

服务器端(需要尝试捕获):

socket = new Socket(args[0], 8888);
     dataOutputStream = new DataOutputStream(socket.getOutputStream());
     dataInputStream = new DataInputStream(socket.getInputStream());
     dataOutputStream.writeUTF(args[1]);
     System.out.println("Saving image");
     FileOutputStream fileout = new FileOutputStream("/home/jamie/Documents/UMDSummer16/Thermal/TemporalAnalysisSensor/SocketTest/"+args[2]);
     byte[] bytes = new byte[1024];
     int count;
     while ((count = dataInputStream.read(bytes)) > 0){
         fileout.write(bytes);
     }
     fileout.close();
     dataInputStream.close();

Android 端(也在 try catch 中):

FileInputStream in = new FileInputStream(lastSavedPath);
byte[] buffer = new byte[1024];
int length = 0;
while ((length = in.read(buffer, 0, buffer.length)) != -1) {
    outputStream.write(buffer, 0, length);
}
outputStream.flush();
Log.d("Socket Listener", "Data has been sent");
in.close();
socket.close();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-08-12
    • 2012-01-23
    • 2012-05-07
    • 2020-11-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多