Mohammad Rajob Mohammad Rajob - 4 months ago 38
Android Question

Android Extract EXIF metadata from byte[] data

I have a custom camera application. I need metadata of Image captured by the custom camera. I saved the byte data before decodebytearray (Constant.imageData1 = data;) and save it to a constant class with type byte and before using this byte data I converted it to string. When I going to execute it with ExifInterface and show it to log, then the application crashes.

Here is my OnPictureTaken Method:

PictureCallback mPicture = new PictureCallback() {
@Override
public void onPictureTaken(byte[] data, Camera camera) {
Constant.imageData1 = data;
Log.e("Camrera", "22222222222222222");
BitmapFactory.Options bfo = new BitmapFactory.Options();
bfo.inDither = false;
// bfo.inJustDecodeBounds = true;
bfo.inPurgeable = true;
bfo.inTempStorage = new byte[16 * 1024];

Intent intent = new Intent(context, PreviewActivity.class);
// intent.putExtra("data", data);
Bitmap bitmapPicture = BitmapFactory.decodeByteArray(data, 0,
data.length, bfo);
Matrix matrix = new Matrix();
if (Constant.result == 180) {
matrix.postRotate(270);
}
if (Constant.result == 270) {
matrix.postRotate(180);
}
int height = bitmapPicture.getHeight();
int width = bitmapPicture.getWidth();
//Bitmap scaledBitmap = Bitmap.createScaledBitmap(bitmapPicture,
//height, width, true);
Bitmap rotatedBitmap = Bitmap.createBitmap(bitmapPicture, 0, 0,
bitmapPicture.getWidth(), bitmapPicture.getHeight(), matrix,
true);
ByteArrayOutputStream blob = new ByteArrayOutputStream();
Log.e("Camrera1", "22222222222222222");
rotatedBitmap.compress(CompressFormat.JPEG,
50 /* ignored for PNG */, blob);
byte[] bitmapdata = blob.toByteArray();
Constant.imageData = bitmapdata;
Log.e("Camrera2", "22222222222222222");
startActivity(intent);

}
};


Here is my execution code:

private void SaveImage() {
try {
String data = byteArrayToString(Constant.imageData1);
ExifInterface ex = new ExifInterface(data);
String make = ex.getAttribute(ExifInterface.TAG_MAKE);
Log.e("Make", make);
Log.e("Make", make);
Log.e("Make", make);
finish();

} catch (Exception e) {
e.printStackTrace();
}
}


And the bytearraytostring method is:

public static String byteArrayToString(byte[] bytes)
{
return new String(bytes);
}


This is very important to me. Please help me.

RDC RDC
Answer

Please try the code snippet below, and change it where you need to. Warning: I haven't tested it.

So, basically, what I did is this:

  • Step 1. Get the byte array from the camera in the onPictureTaken method.
  • Step 2. Create a file on the SDCard and write the byte array to the file
  • Step 3. Read Exif Metadata from File-Path

    @Override
    public void onPictureTaken(byte[] data, Camera camera) {
    
        //Step 1. Create file for storing image data on SDCard
        File sdDir = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES);
        File pictureFileDir = new File(sdDir, "RDCCameraImages");
    
        if (!pictureFileDir.exists() && !pictureFileDir.mkdirs()) {
    
          Log.d(TAG, "Can't create directory to save image.");
          return;
    
        }
    
        //Step 2. write image byte array to file
        String photoFile = "Picture_" + date + ".jpg";
        String imageFilePath = pictureFileDir.getPath() + File.separator + photoFile;
        File pictureFile = new File(imageFilePath);
    
        try 
        {
              FileOutputStream fos = new FileOutputStream(pictureFile);
              fos.write(data);
              fos.close();
              Toast.makeText(context, "New Image saved:" + photoFile,
                  Toast.LENGTH_LONG).show();
            } catch (Exception error) {
              Log.d(TAG, "File" + filename + "not saved: "
                  + error.getMessage());
              Toast.makeText(context, "Image could not be saved.",
                  Toast.LENGTH_LONG).show();
        }           
        //Step 3. Get Exif Info from File path
        ExifInterface exif;
        try {
            exif = new ExifInterface(imageFilePath);
            String make = exif.getAttribute(ExifInterface.TAG_MAKE);
    
        } catch (IOException e) {
            e.printStackTrace();
        }
    
        //check the value of  “make” here
    

    }

Comments