Androidアプリでファイルのタイムスタンプを変更する方法について

Androidスマホで撮影した写真をSDカードに移動したところ、タイムスタンプが変わってしまったので修正したくなりました。

パソコンに移して修正しても良かったのですが、どうせならAndroidアプリで修正しようと思います。

【追記】更新日時修正ツールをリリース

修正するためのツール(アプリ)をリリースしました。

Google Plyaストアから無料でダウンロードできます。是非、以下のダウンロードページからご利用ください。

ダウンロード

Androidアプリ 更新日時修正ツールをリリースしました!

修正方針

Exifには正しい日時が入っていたので、その情報を元にファイルのタイムスタンプを変更しようと思いますが、結論から言うと半分成功して、半分失敗しました。

とりあえず、タイムスタンプを変更するためのコードは以下の通りです。

Java
Calendar calendar = Calendar.getInstance();
calendar.clear(); calendar.setTimeInMillis("新しいタイムスタンプ");
File file = new File("ファイルパス");
file.setLastModified(calendar.getTimeInMillis());

動作確認

Android 8.0で動作しているエミュレータ上で、このコードでファイルのタイムスタンプが変更でき、修正対象のファイルを割り出すためのアプリも完成しました。

次にAndroid 7.0で動作している実機で試してみると…変更できないではありませんか…。

setLastModifiedからの戻り値は常にfalseです。

実はこの件については7年も前から話題になっていることが分かりました。

プレイストアにアップできる直前までのアプリが完成している状態なのでガックリです。

念のため、Android 7.0のエミュレータで動作確認すると実機と同じ動きでしたので、Android 8.0からはsetLastModifiedが使えるようになっているみたいです。

別の方法

setLastModifiedが使えなくても別の方法があるのではないか考えてみました。

こちらの方法もAndroid 8.0では成功して、Android 7.0では失敗に終わりました。

Java
Runtime.getRuntime().exec(new String[] {"/system/bin/touch", "-c", "-t", "新しい日時", "ファイルパス"});
Runtime.getRuntime().exec(new String[] {"/system/bin/touch", "-c", "-m", "-t", "新しい日時", "ファイルパス"});

更に別の方法

Java
String pattern = "yyyy-MM-dd HH:mm:ss";
SimpleDateFormat simpleDateFormat = new SimpleDateFormat(pattern);
Date date = simpleDateFormat.parse("2019-01-01 10:00:00");
FileTime fileTime = FileTime.fromMillis(date.getTime());
Files.setAttribute("ファイルパス", "lastModifiedTime", fileTime);
Files.setAttribute("ファイルパス", "lastAccessTime", fileTime);
Files.setAttribute("ファイルパス", "creationTime", fileTime);

まとめ

ファイルのタイムスタンプの変更は、Android 8.0からできるようになる。と言うことが分かりました。

時期が来たら作ったアプリを公開しようと思います。

(2019年1月14日 追記)ツール(アプリ)をリリースしました。

Androidアプリ 更新日時修正ツールをリリースしました!

今回の件は、以下が少しだけヒントになりそうでした。

以上、Androidアプリでファイルのタイムスタンプを変更する方法についてでした。