質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

89.09%

画像保存時の日付設定について

解決済

回答 2

投稿

  • 評価
  • クリップ 0
  • VIEW 3,260

chie_y

score 20

前提・実現したいこと

Android Studioでカメラで取得した画像を内部ストレージに保存する簡単なサンプルプログラムを作っています。しかし、写真自体は保存されるものの、プロパティを開いたところファイル名が指定したもの(日付を入れたファイル名を生成)、ランダムな数字(例:1479132048928.jpg)になってしまいます。

さらに、撮影したすべてのファイルの更新日と作成日が1970年1月1日 9:00になってしまいます。

実装したコードは以下の通りです。
どのように修正すれば、ファイル名や日付が正しくセットされるのでしょうか?
わかる方がいらっしゃればご教示願います。
minimum SDK version は2.3(API 9)を指定しています。

まだ、プログラミング初心者なので、初歩的な質問で申し訳ないのですが、よろしくお願いいたします。

該当のソースコード

File fname = new File(obj.getFilesDir() + "/" + new SimpleDateFormat("yyyy-MM-dd_HH-mm-ss", java.util.Locale.JAPAN).format(new Date()) + ".jpg");
FileOutputStream fos = new FileOutputStream(fname);
bitmap.compress(Bitmap.CompressFormat.JPEG, 100, fos);
fos.flush();
fos.close();

ContentValues values = new ContentValues();
ContentResolver contentResolver = obj.getContentResolver();
values.put(MediaStore.Images.Media.MIME_TYPE, "image/jpeg");
values.put(MediaStore.Images.Media.DATE_TAKEN, System.currentTimeMillis() / 1000);
values.put(MediaStore.Images.Media.SIZE, fname.length());
values.put(MediaStore.Images.Media.TITLE, fname.getName());
values.put(MediaStore.Images.Media.DATA, fname.getPath());
MediaStore.Images.Media.insertImage(getContentResolver(), bitmap, fname.toString(), null);
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • MasahikoHirata

    2016/11/15 00:08

    まず明確な誤りは’values.put(MediaStore.Images.Media.DATE_TAKEN, System.currentTimeMillis() / 1000);’の'/1000'は要りません。つまり’values.put(MediaStore.Images.Media.DATE_TAKEN, System.currentTimeMillis());’です。

    キャンセル

  • swordone

    2016/11/15 00:28

    何で実行しているのでしょうか?エミュレータなのか実機なのか。あるいはその実行環境の時刻設定がおかしい可能性も考えられます。

    キャンセル

  • chie_y

    2016/11/15 08:13

    >MasahikoHirata 様 /1000を抜きました。変わらすでしたが、他いろいろと試してみます。アドバイスありがとうございました。 

    キャンセル

  • chie_y

    2016/11/15 08:14

    >swordone 様 実行しているのは、実機で動作確認をしています。実行環境の時刻設定ですね。確認してみます!ありがとうございます。

    キャンセル

回答 2

checkベストアンサー

0

あなたがしているのはメディアを管理するデータベースにファイルデータを登録しているだけであり、でファイル自体のデータを書き換えているわけではありません。
ExifInterfaceを使う必要があります。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/11/15 09:07

    yona様
    アドバイスありがとうございます。
    new ExifInterface(fname.toString()); を追記したのですが、変わりませんでした。


    try {
    File fname = new File(obj.getFilesDir() + "/" + new SimpleDateFormat("yyyy-MM-dd_HH-mm-ss", Locale.JAPAN).format(new Date()) + ".jpg");
    FileOutputStream fos = new FileOutputStream(fname);
    fos.write(data);
    bitmap.compress(Bitmap.CompressFormat.JPEG, 100, fos);
    fos.flush();
    fos.close();
    ContentValues values = new ContentValues();
    ContentResolver contentResolver = obj.getContentResolver();
    values.put(MediaStore.Images.Media.MIME_TYPE, "image/jpeg");
    values.put(MediaStore.Images.Media.DATE_TAKEN, System.currentTimeMillis());
    values.put(MediaStore.Images.Media.SIZE, fname.length());
    values.put(MediaStore.Images.Media.TITLE, fname.getName());
    values.put(MediaStore.Images.Media.DATA, fname.getPath());
    MediaStore.Images.Media.insertImage(getContentResolver(), bitmap, fname.toString(), null);
    new ExifInterface(fname.toString());

    Toast.makeText(CameraActivity.this, "保存しました。", Toast.LENGTH_SHORT).show();
    } catch (Exception e) {
    Log.e("Debug", e.getMessage());
    }

    アドバイスいただけましたら幸いです。何卒よろしくお願いいたします。

    キャンセル

  • 2016/11/15 10:47 編集

    インスタンス化しただけで思った通りになるはずがないですよ。

    ExifInterface#setAttributeを使い属性を設定し、ExifInterface#saveAttributesを使い設定を保存してください。
    設定する項目についてはExifInterfaceのリファレンスを参照してくださいね。
    https://developer.android.com/reference/android/media/ExifInterface.html

    キャンセル

  • 2016/11/15 23:24

    yona様
    アドバイスありがとうございます。
    リファレンスも参考にさせていただき、
    ExifInterface exif = new ExifInterface(fname.toString());
    exif.setAttribute(ExifInterface.TAG_DATETIME,("yyyy-MM-dd_HH-mm-ss"+ ".jpg"));

    exif.saveAttributes();

    このように追記して、作動はするのですが、保存日時とファイル名が変わらずでしので、
    下記で訂正したらうまくいきました。

    // フォルダ作成
    if (!file.exists()) {
    if (!file.mkdir()) {
    Log.e("Debug", "Make Dir Error");
    }
    }

    // 画像保存パス
    Calendar cal = Calendar.getInstance();
    SimpleDateFormat sf = new SimpleDateFormat("yyyyMMdd_HHmmss");
    String imgPath = saveDir + "/" + sf.format(cal.getTime()) + ".jpg";

    // ファイル保存
    FileOutputStream fos;
    try {
    fos = new FileOutputStream(imgPath, true);
    fos.write(data);
    fos.close();

    // アンドロイドのデータベースへ登録
    // (登録しないとギャラリーなどにすぐに反映されないため)
    registAndroidDB(imgPath);
    Toast.makeText(CameraActivity.this, "保存しました。", Toast.LENGTH_SHORT).show();
    } catch (Exception e) {
    Log.e("Debug", e.getMessage());
    }
    fos = null;

    アドバイスありがとうございました。

    キャンセル

0

以下のコードで動きませんか?

File fname = new File(obj.getFilesDir() + "/" + new SimpleDateFormat("yyyy-MM-dd_HH-mm-ss", java.util.Locale.JAPAN).format(new Date()) + ".jpg");

FileOutputStream fos;
try {
    fos = new FileOutputStream(fname, true);
    fos.write(data);
    fos.close();

    registAndroidDB(fname.toString());
} catch (Exception e) {
    Log.e("Debug", e.getMessage());
}

fos = null;

Toast.makeText(CameraActivity.this, "保存しました。", Toast.LENGTH_SHORT).show();

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/11/15 21:27


    kazzzstudio様
    回答ありがとうございます。
    試しましたが、保存されませんでした。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 89.09%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる