moshimore Knowledge

アプリ開発・紹介とメモ書き、日々の日記。

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

f:id:moshimore:20170715041846j:plain
Androidスマホで撮影した写真をSDカードに移動したところ、タイムスタンプが変わってしまったので修正したくなりました。
パソコンに移して修正しても良かったのですが、どうせならAndroidアプリで修正しようと思います。

更新日時修正ツールをリリース

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

Google Plyaストアから無料でダウンロードできます。
是非、以下のダウンロードページからご利用ください。
https://play.google.com/store/apps/details?id=jp.moshimore.android.datefixer
play.google.com

knowledge.moshimore.jp

修正方針

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

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

動作確認

Android 8.0で動作しているエミュレータ上で、このコードでファイルのタイムスタンプが変更でき、修正対象のファイルを割り出すためのアプリも完成しました。
次にAndroid 7.0で動作している実機で試してみると…変更できないではありませんか…。
setLastModifiedからの戻り値は常にfalseです。

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

プレイストアにアップできる直前までのアプリが完成している状態なのでガックリです。
念のため、Android 7.0のエミュレータで動作確認すると実機と同じ動きでしたので、Android 8.0からはsetLastModifiedが使えるようになっているみたいです。

別の方法

setLastModifiedが使えなくても別の方法があるのではないか考えてみました。
こちらの方法もAndroid 8.0では成功して、Android 7.0では失敗に終わりました。

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

更に別の方法

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日 追記)ツール(アプリ)をリリースしました。

今回の件は、以下が少しだけヒントになりそうでした。
https://www.xda-developers.com/nexus-pixel-devices-migrate-to-sdcardfs-in-android-o/

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