图像文件缺少exif数据

时间:2017-07-08 23:21:04

标签: android android-image exif android-camera-intent android-external-storage

使用意图拍摄照片,稍后将照片上传到服务器。 图像首先保存到SD卡,如下所示:

/**
 * Creating file uri to store image/video
 */
public Uri getOutputMediaFileUri(int type) {
    return Uri.fromFile(getOutputMediaFile(type));
}

/**
 * returning image / video
 */
private static File getOutputMediaFile(int type) {

    // External sdcard location
    File mediaStorageDir = new File(
            Environment
                    .getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES),
            Config.IMAGE_DIRECTORY_NAME);

    // Create the storage directory if it does not exist
    if (!mediaStorageDir.exists()) {
        if (!mediaStorageDir.mkdirs()) {
            Log.d(TAG, "Oops! Failed create "
                    + Config.IMAGE_DIRECTORY_NAME + " directory");
            return null;
        }
    }

    // Create a media file name
    String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss",
            Locale.getDefault()).format(new Date());
    File mediaFile;
    if (type == MEDIA_TYPE_IMAGE) {
        mediaFile = new File(mediaStorageDir.getPath() + File.separator
                + "IMG_" + timeStamp + ".jpg");
    } else if (type == MEDIA_TYPE_VIDEO) {
        mediaFile = new File(mediaStorageDir.getPath() + File.separator
                + "VID_" + timeStamp + ".mp4");
    } else {
        return null;
    }

    return mediaFile;
}

保存的图片没有exif数据。这是由于uri? (使用默认相机应用拍摄的照片有exif数据,因此必须在我的应用中出现问题)。

编辑:用于启动默认相机应用的代码:

/**
 * Launching camera app to capture image
 */
private void captureImage() {
    Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);

    fileUri = getOutputMediaFileUri(MEDIA_TYPE_IMAGE);

    intent.putExtra(MediaStore.EXTRA_OUTPUT, fileUri);

    // start the image capture Intent
    startActivityForResult(intent, CAMERA_CAPTURE_IMAGE_REQUEST_CODE);
}

存储的网址:

/**
 * Here we store the file url as it will be null after returning from camera
 * app
 */
@Override
protected void onSaveInstanceState(Bundle outState) {
    super.onSaveInstanceState(outState);

    // save file url in bundle as it will be null on screen orientation
    // changes
    outState.putParcelable("file_uri", fileUri);
}

@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
    super.onRestoreInstanceState(savedInstanceState);

    // get the file url
    fileUri = savedInstanceState.getParcelable("file_uri");
}

来源:http://www.androidhive.info/2014/12/android-uploading-camera-image-video-to-server-with-progress-bar/

1 个答案:

答案 0 :(得分:2)

  

使用默认相机应用拍摄的照片有exif数据,因此它必须是我的应用中的问题

不一定。从您显示的代码中,它似乎是该特定相机应用程序中的错误。并非所有相机应用开发者都能很好地测试ACTION_IMAGE_CAPTURE。除非您在拍摄照片后的某个时间修改图像,但在运行EXIF测试之前,相机应用程序不会将EXIF标签添加到通过ACTION_IMAGE_CAPTURE拍摄的照片中。 These things happen

您可以安装一些相机应用,看看它们与ACTION_IMAGE_CAPTURE的行为方式。例如,Open Camera支持ACTION_IMAGE_CAPTURE,但在使用ACTION_IMAGE_CAPTURE启动时尚未测试其EXIF行为。