2016-10-31 3 views
0

Ich arbeite mit Camera 2 API und ich brauche Bild-Metadaten (genau ISO), bevor das Bild auf dem Gerät gespeichert wird.Wie kann ich Metadaten erhalten, bevor das Bild gespeichert wird?

In diesem Moment verwende ich ExifInterface, aber Konstruktor dieser Klasse erhalten nur File oder beginnen von api24 InputStream.

Wie kann ich ISO von Bild erhalten, bevor es gespeichert wird?

EDIT

private final ImageReader.OnImageAvailableListener mOnImageAvailableListener 
     = new ImageReader.OnImageAvailableListener() { 

    @Override 
    public void onImageAvailable(final ImageReader reader) { 

     new AsyncTask<Void, Void, Void>() { 

      @Override 
      protected Void doInBackground(Void... voids) { 
       new ImageSaver(context, reader.acquireNextImage()).writeImageToStorage(); 
       return null; 
      } 
     } 
    } 
}; 

public final class ImageSaver { 
private Context context; 
private static File imageFile; 
private final Image image; 

public ImageSaver(Context context, Image image) { 
    this.context = context; 
    this.image = image; 
    imageFile = getImageFile(UtilClass.getAvatarPhotosDirFile(context)); 
} 

private File getImageFile(File path) { 
    return new File(path.getPath() + File.separator + getStamp() + ".jpeg"); 
} 

public void writeImageToStorage() { 
    final ByteBuffer buffer = getByteBuffer(); 
    final byte[] bytes = getBytes(buffer); 
    writeFile(imageFile, bytes); 
} 

@Nullable 
private ByteBuffer getByteBuffer() { 
    ByteBuffer buffer = null; 
    if (image != null) { 
     buffer = image.getPlanes()[0].getBuffer(); 
    } 
    return buffer; 
} 

private byte[] getBytes(ByteBuffer buffer) { 
    byte[] bytes = new byte[0]; 
    if (buffer != null) { 
     bytes = new byte[buffer.remaining()]; 
    } 
    if (buffer != null) { 
     buffer.get(bytes); 
    } 
    return bytes; 
} 

private void writeFile(File file, byte[] bytes) { 
    BufferedOutputStream bos = null; 

    try { 
     bos = new BufferedOutputStream(new FileOutputStream(file)); 
     bos.write(bytes); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } finally { 
     if (image != null) { 
      image.close(); 
     } 
     if (null != bos) { 
      try { 
       bos.close(); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
     } 
    } 
} 

@NonNull 
private String getStamp() { 

    final int pictureAmount = PreferencesHelper.getIntShared(context, States.PICTURE_AMOUNT) + 1; 
    String stamp; 

    switch (pictureAmount){ 
     case 1: 
      stamp = "pose1"; 
      break; 
     case 2: 
      stamp = "pose3"; 
      break; 
     case 3: 
      stamp = "pose5"; 
      break; 
     case 4: 
      stamp = "pose7"; 
      break; 
     default: 
      stamp = "BG"; 
      break; 
    } 
    return stamp; 
} 

public static String getImageFilePath() { 
    return imageFile.getPath(); 
} 

} 
+0

Sie könnten zeigen, wie und wo Sie das Bild bekommen. In welcher Form? Und wie Sie es speichern. – greenapps

+0

@greenapps hinzugefügt –

+0

Viel zu vage. Bitte zeigen Sie auch, wie Sie ein 'Image' in Datei speichern. Sind Sie sicher, dass die Datei ein Exif enthält, wenn Sie dies tun? Was ist eine übliche Datei? Und wo ist der Exif im Bild? Wie könnte es einen enthalten? – greenapps

Antwort

0
ByteArrayinputStream bais = new ByteArrayInputStream(bytes); 

Wo bytes ein JPEG enthält.

Verwenden Sie bais als InputStream für ein neues ExifInterface für Android 7.0.

Verwenden Sie eine andere Exifinterface-Klasse. Es gibt mehr als eins.

+0

ja ich habe dich richtig verstanden. Wenn ich Android 7.0 hätte, würde ich hier keine Frage stellen ... aber ich habe Android 6.0, wie ich bereits gesagt habe ... Soweit ich weiß, gibt es nur eine Klasse, die Zugriff auf Bild Meta geben ... trotzdem danke! –

Verwandte Themen