Exifを削除・修正するのにExifInterfaceは使わない方が良い。
ExifInterface.saveAttributes()だけ使った上書き方法だと、モデル名やメーカー名どころかGPS情報すら残っていた事を確認しました。
ExifInterface.saveAttributes()は書込んで無い情報を消すのではなく、対応していない属性の値を消す(ように見える)らしく、自分の認識が間違っていました。
ExifInterface.setAttribute()で削除に必要なTAGを設定してExifInterface.saveAttributes()すればよいのですが、
下手にTAGを設定すると対応していない属性を破壊しかねなので素直に他のライブラリ(sanselan)を使うか処理を自作して下さい(Exifには設定してはいけなかったり、値が存在しないとダメなTAGって言うのがいくつかあるからです)
間違ったエントリーをしてすいませんでした(戒めの為にしばらく残しておきます)
結構簡単に出来た。
但し細かい所で色々と困る所があるので調整する。
OS: Windows7 professional
IDE: Android Studio 3.0
Java: JDK 1.8
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
try {
/*
1. AndroidManifest.xml に以下のパーミッションを登録する事
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
2. アプリの権限からストレージへのアクセスを許可する事
*/
String path = Environment.getExternalStorageDirectory().getPath();
ExifInterface exif = new ExifInterface(path+"/photo008.jpg");
/* Exifの削除 */
exif.saveAttributes();
} catch (IOException e) {
e.printStackTrace();
}
}
正確に言うと saveAttributes() はExif情報を消すメソッドではなくsetAttribute()で設定した値を反映させるためのメソッドです。
その際に古いExif情報は全部消すという仕様らしい。
なので何も設定せずに saveAttributes() だけするとExif情報だけが消えると言う仕組みだ。
ただExif情報が全部消えると言うわけでなく、メーカー名やモデル名は残っていた。
またExif領域も残ったままになっている。
メーカー名やモデル名が残っていても問題は無いと思うが、その辺もまとめて消したいならこう書けばOK
try {
String path = Environment.getExternalStorageDirectory().getPath();
ExifInterface exif = new ExifInterface(path+"/photo008.jpg");
/* Exifの削除 */
exif.setAttribute(ExifInterface.TAG_MAKE, "");
exif.setAttribute(ExifInterface.TAG_MODEL, "");
exif.saveAttributes();
} catch (IOException e) {
e.printStackTrace();
}
簡単なアプリくらいなら、この程度の実装でも問題ないかな…(他にいい方法あったら教えてください)