如何在Android中将exif数据写入图像?

时间:2015-01-01 17:01:57

标签: java android exif android-gallery android-camera-intent

我正在尝试使用exif界面在Android应用程序中为捕获的图像编写User_CommentTAG_GPS,但由于某种原因,标记似乎没有附加到图像当我在画廊中查看图像的细节时。

似乎可能没有将标签写入捕获的图像,因为文件路径可能是错误的。我想这可能是因为我已经将标签写入了错误的图像路径。

有人知道我的标签写入图片的方式是否有问题吗?

这是在@ Charlie的更改后保存exif数据的代码:

private File getOutputPhotoFile() throws IOException {
          File directory = new File(Environment.getExternalStoragePublicDirectory(
                        Environment.DIRECTORY_PICTURES), getPackageName());
          if (!directory.exists()) {
            if (!directory.mkdirs()) {
              Log.e(TAG, "Failed to create storage directory.");
              return null;
            }
          }


          String timeStamp = new SimpleDateFormat("yyyMMdd_HHmmss", Locale.ENGLISH).format(new Date());

          File[] files = directory.listFiles();

          File exifVar =  new File(directory.getPath(), "IMG_" + timeStamp + ".jpg");
          if(files.length!=0) {
              File newestFile = files[files.length-1];
              exifVar =  new File(directory.getPath() + File.separator + newestFile.getName());
          }

          String mString = "Generic Text..";     
          ExifInterface exif = new ExifInterface(exifVar.getAbsolutePath());
          exif.setAttribute("UserComment", mString);
          exif.saveAttributes();


          exif.setAttribute(ExifInterface.TAG_GPS_LATITUDE,
            String.valueOf(latituteField.toString()));

          exif.setAttribute(ExifInterface.TAG_GPS_LONGITUDE, 
            String.valueOf(longitudeField.toString()));

          exif.saveAttributes();

          return exifVar; 




    }

3 个答案:

答案 0 :(得分:3)

首先需要将位于google exif的exif文件复制到项目中,然后使用以下代码:

ExifInterface exif = new ExifInterface();
exifi.readExif(exifVar.getAbsolutePath());
exif.setTagValue(ExifInterface.TAG_USER_COMMENT, mString);
exif.forceRewriteExif(exifVar.getAbsolutePath())); 

此处使用的ExifInterface是您刚刚添加的新内容。

答案 1 :(得分:2)

您正在使用exifVar.toString()。这只返回文件名,而不是图像的路径。由于您的应用可能不在包含图片的文件夹中,因此您应使用exifVar.getAbsolutePath()

如果您在运行程序的同时没有拍摄照片,那么Path就不对了。请改用此代码:

File[] files = directory.listFiles();

if(files.length==0) {
    // No images available
    return;
}

File newestFile = files[files.length-1];

File exifVar =  new File(directory.getPath() + File.separator + newestFile.getName());

题外话:

根据你庞大的导入列表:

import android.content.*;

进口

android.content.Context,
android.content.DialogInterface and
android.content.Intent

这会使你的代码变得更短。只是说

答案 2 :(得分:0)

确保将写入权限设置为sd(静态和动态), 同样对于Android 10,您需要设置以下内容: android:requestLegacyExternalStorage =“ true”

到清单应用程序