71525
以下の `//ファイル名を日時時刻に設定する` にてエラーが出ています。

```

    DateFormat.format("yyyy-MM-dd_kk.mm.ss", msec).toString();
    
```

インポート文を調べてみたり、`("yyyy-MM-dd_kk:mm:ss", msec)` に変更してみましたが、エラーが解除されません。  
どのようにすればエラー解除できるでしょうか。

```

    package com.example.oekaki;
    
    import android.content.ContentResolver;
    import android.content.ContentValues;
    import android.content.Context;
    import android.graphics.Bitmap;
    import android.graphics.Canvas;
    import android.graphics.Color;
    import android.graphics.Paint;
    import android.graphics.Point;
    import android.os.Environment;
    import android.provider.MediaStore;
    import android.util.AttributeSet;
    import android.view.MotionEvent;
    import android.view.View;
    import android.widget.Toast;
    
    import java.io.File;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.util.ArrayList;
    import java.text.DateFormat;
    
    public class CanvasView extends View {
        //すべての線を管理するリスト
        private ArrayList<Line> lines = new ArrayList<Line>();
        //一本の線
        private Line aLine;
        //描画色
        private int currentColor = Color.BLACK;
        //コンテスト
        private Context context;
        //線の太さの初期値
        public int lineWidth = 10;
        //コンストラクタ
        public CanvasView(Context context, AttributeSet attrs){
            super(context, attrs);
            this.context = context;
        }
    
        //最後の線を消去する
        public  void undo(){
            if (lines.size()>0){
                lines.remove(lines.size() - 1);
            }
            invalidate();
        }
    
        //すべての線を消去する
        public void clear(){
            lines.clear();
            invalidate();
        }
    
        @Override
        protected void onDraw(Canvas canvas){
            super.onDraw(canvas);
            drawAll(canvas);
        }
    
        //すべての線を描画する
        public void drawAll(Canvas canvas){
            //背景を白に
            canvas.drawColor(Color.WHITE);
            Paint paint = new Paint();
            //アンチエイリアスを有効に
            paint.setAntiAlias(true);
    
            //すべての線を描画する
            for (Line line : lines){
                //色を設定
                paint.setColor(line.getColor());
                //線幅を設定
                paint.setStrokeWidth(lineWidth);
                //ポイントをつなげて一本の線を描画する
                for (int i = 0; i < (line.getPoints().size() - 1); i++){
                    Point s = line.getPoints().get(i);
                    Point e = line.getPoints().get(i + 1);
                    //2点間の線を引く
                    canvas.drawLine(s.x, s.y, e.x, e.y, paint);
                }
            }
        }
    
        @Override
        public boolean onTouchEvent(MotionEvent event){
            switch (event.getAction()){
                case MotionEvent.ACTION_DOWN:
                    //新しい線を生成
                    aLine = new Line(currentColor);
                    //linesに線を追加
                    lines.add(aLine);
                    break;
                case MotionEvent.ACTION_MOVE:
                    int x = (int) event.getX();
                    int y = (int) event.getY();
                    Point p = new Point(x, y);
                    //線にポイントを追加
                    aLine.addPoint(p);
                    break;
                case MotionEvent.ACTION_UP:
                    break;
            }
    
            //画面を再描画
            invalidate();
            return true;
        }
    
        //色を設定する
        public void setColor(int c){
            currentColor = c;
        }
    
        //ギャラリーに画像を保存する
        public void saveFile(){
            Bitmap myBitmap;
            Canvas bitmapCanvas;
    
            //Bitmapオブジェクトを作成する
            myBitmap = Bitmap.createBitmap(this.getWidth(), this.getHeight(), Bitmap.Config.ARGB_8888);
    
            //BitmapのCanvasオブジェクトを生成する
            bitmapCanvas = new Canvas(myBitmap);
            //すべての線を描く
            drawAll(bitmapCanvas);
    
            //ストレージが利用可能か調べる
            String status = Environment.getExternalStorageState();
            File storageDir;
            if (status.equals(Environment.MEDIA_MOUNTED)) {
                String storageDirPath = Environment.getExternalStorageDirectory().getAbsolutePath() + "/Oekaki";
                storageDir = new File(storageDirPath);
                //ディレクトリがなければ作成する
                if (!storageDir.exists()) {
                    storageDir.mkdirs();
                }
            **}else{
                Toast.makeText(context, "Could not access the storage.", Toast.LENGTH_LONG).show();
                return;
            }
            //ファイル名を日時時刻に設定する**
            long msec = System.currentTimeMillis();
            String fname = DateFormat.format("yyyy-MM-dd_kk:mm:ss", msec).toString();
            fname = storageDir.getAbsolutePath() + "/" + fname + ".png";
    
            //画像をファイルに書き込む
            try{
                FileOutputStream outstream = new FileOutputStream(fname);
                myBitmap.compress(Bitmap.CompressFormat.PNG, 100, outstream);
                outstream.flush();
                outstream.close();
            } catch(IOException e){
                Toast.makeText(context, "Could not write file.", Toast.LENGTH_LONG).show();
            }
    
            //「ギャラリー」のデータベースに登録
            ContentResolver contentResolver = context.getContentResolver();
            ContentValues contentValues = new ContentValues();
            contentValues.put(MediaStore.MediaColumns.MIME_TYPE, "image/png");
            contentValues.put(MediaStore.MediaColumns.DATA, fname);
            contentResolver.insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, contentValues);
        }
    
    }
    
```

エラーメッセージはこちらになります。

```

    C:\Users\user\Oekaki\app\src\main\java\com\example\oekaki\CanvasView.java:144: �G���[: format�ɓK�؂ȃ��\�b�h�����‚���܂���(String,long)
        String fname = DateFormat.format("yyyy-MM-dd_kk.mm.ss", msec).toString();
                                 ^
    ���\�b�h Format.format(Object)�͎g�p�ł��܂���
      (���������X�g�Ɖ��������X�g�̒������قȂ�܂�)
    ���\�b�h Format.format(Object,StringBuffer,FieldPosition)�͎g�p�ł��܂���
      (���������X�g�Ɖ��������X�g�̒������قȂ�܂�)
    ���\�b�h DateFormat.format(Object,StringBuffer,FieldPosition)�͎g�p�ł��܂���
      (���������X�g�Ɖ��������X�g�̒������قȂ�܂�)
    ���\�b�h DateFormat.format(Date,StringBuffer,FieldPosition)�͎g�p�ł��܂���
      (���������X�g�Ɖ��������X�g�̒������قȂ�܂�)
    ���\�b�h DateFormat.format(Date)�͎g�p�ł��܂���
      (���������X�g�Ɖ��������X�g�̒������قȂ�܂�)
    
```
CC BY-SA 4.0
2020-10-25T01:05:25.090
71487
2020-10-26T13:32:54.527
2020-10-25T05:35:44.677
3060
42195
question
java android
DateFormat.format のエラー
```

    DateFormat.format("yyyy-MM-dd_kk:mm:ss", msec).toString();
    
```

の部分を

```

    DateFormat.SimpleDateFormat("yyyy-MM-dd_kk:mm:ss", msec).toString();
    
```

にしてみてください。

＝＝  
DateFormatに format というサブクラスが存在していないからエラーが出ています。  
DateFormatには、SimpleDateFormatというサブクラスがあるので、それを使えば解決するはずです。

SimpleDateFormatの使い方は、[SimpleDateFormat](https://developer.android.com/reference/java/text/SimpleDateFormat)のページを参照してください。
CC BY-SA 4.0
2020-10-25T02:06:47.060
71488
2020-10-25T02:06:47.060
217
71487
answer
質問するときは環境に関する情報を詳しく記述しましょう。

  * [技術系メーリングリストで質問するときのパターン・ランゲージ](https://www.hyuki.com/writing/techask.html)

`DateFormat.format()`メソッドはインスタンスメソッドであり、呼び出しにはインスタンスが必要ですが、[`DateFormat`](https://developer.android.com/reference/java/text/DateFormat)自体は抽象クラスであり、そのままインスタンス化することはできません。

また、ファイル名にコロン`:`を使うのはやめておいたほうがよいと思います。Windowsなど一部のファイルシステムでは扱えません。

```

    import java.text.SimpleDateFormat;
    import java.util.Date;
    import java.util.Locale;
    
    ...
    
            final SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd_HH_mm_ss", Locale.ROOT);
            final String strCurrentDateTime = sdf.format(new Date());
            final File imageFile = new File(storageDir, strCurrentDateTime + ".png");
    
            FileOutputStream outStream = null;
            try {
                outStream = new FileOutputStream(imageFile);
                myBitmap.compress(Bitmap.CompressFormat.PNG, 100, outStream);
            } catch (final IOException e) {
    ...
            } finally {
                if (outStream != null) {
                    outStream.close();
                }
            }
    
```

なお、[`AutoCloseable`](https://developer.android.com/reference/java/lang/AutoCloseable)の使えるAPIレベル19
(Android 4.4) 以降ではtry-finallyの代わりにtry-with-resourcesを使うことを推奨します。

```

            try (final FileOutputStream outStream = new FileOutputStream(imageFile)) {
                myBitmap.compress(Bitmap.CompressFormat.PNG, 100, outStream);
            } catch (final IOException e) {
    ...
            }
    
```

余談ですが[`Environment.getExternalStorageDirectory()`](https://developer.android.com/reference/android/os/Environment)はAPIレベル29
(Android 10) で非推奨 (deprecated)
になっています。これは「[対象範囲別ストレージ](https://developer.android.com/training/data-
storage/files/external-
scoped?hl=ja)」によるセキュリティ強化の一環で、`READ_EXTERNAL_STORAGE`権限や`WRITE_EXTERNAL_STORAGE`権限があってもパブリックのファイルやディレクトリに対する直接アクセスができなくなります。

今後、パブリックディレクトリにファイルを保存するときは **MediaStore** APIや **Storage Access Framework**
(SAF) を使う必要があります。

  * [外部ストレージにファイルを保存する | Android デベロッパー | Android Developers](https://developer.android.com/training/data-storage/files/external?hl=ja#PublicFiles)
CC BY-SA 4.0
2020-10-25T15:11:04.157
71501
2020-10-25T15:42:10.310
2020-10-25T15:42:10.310
15413
15413
71487
answer
import文を

import android.text.format.DateFormat;

に変更したら、エラーが解除されました。ありがとうございます。  
現状、

String fname = DateFormat.format("yyyy-MM-dd_kk.mm.ss", msec).toString();

としています。  
ただ、Androidの実機にて保存を押すとアプリが落ちてしまいます。
CC BY-SA 4.0
2020-10-26T13:32:54.527
71525
2020-10-26T13:32:54.527
42195
71487
answer