Android从byte []数据中提取EXIF元数据

时间:2013-11-20 09:53:11

标签: android metadata android-camera exif

我有自定义相机应用程序。我需要自定义相机捕获的图像元数据。我在decodebytearray(Constant.imageData1 = data;)之前保存了字节数据,并将其保存到类型为byte的常量类中,在使用此字节数据之前,我将其转换为字符串。当我要用ExifInterface执行它并将其显示为log时,应用程序崩溃。

这是我的OnPictureTaken方法:

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);

    }
};

这是我的执行代码:

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();
        }
}

而bytearraytostring方法是:

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

这对我来说非常重要。请帮帮我。

1 个答案:

答案 0 :(得分:4)

请尝试下面的代码段,然后根据需要进行更改。警告:我没有测试过。

所以,基本上,我所做的就是这个:

  • 第1步。在onPictureTaken方法中从相机中获取字节数组。
  • 第2步。在SDCard上创建文件并将字节数组写入文件
  • 第3步。从文件路径中读取Exif元数据

    @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
    

    }