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

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

ただいまの
回答率

88.04%

API23未満のandroidで画像を保存できない

受付中

回答 0

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 872

score 23

【目的】API23未満のandroid端末でDCIMにフォルダを作成し、そのなかに画像を保存したい。

【現状】
ボタンをクリックすると画面キャプチャした画像をDCIMに作製したフォルダに保存するテストを行っていますが、
なぜかうまくいきません。エラーも出ていないという状態になります。
(Android 7.0, API 22)
※Android 7.0はAPI 24なはずなのですが、下図のように表示されています、、、
イメージ説明

【コード】
※manifestには<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />を追加済み

class MainActivity : AppCompatActivity() {
    val REQUEST_PERMISSION = 1000

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

            button.setOnClickListener {

                if (ActivityCompat.checkSelfPermission(this,
                                Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED) {


                val calendar = Calendar.getInstance()
                val filenametest = "RC_" + (android.text.format.DateFormat.format("yyyyMMdd_HHmmss", calendar)).toString() + ".jpg"


                // 読み書きするファイル名を指定
                val file = File(Environment.getExternalStorageDirectory().path + "/DCIM/result_capture/", filenametest)

                // 指定したファイル名が無ければ作成する。
                file.parentFile.mkdir()

                saveCapture(findViewById(android.R.id.content), file)

                toast("画像を保存しました")

                } else {
                    requestLocationPermission()
                }// 拒否していた場合

            }
        }

    // 許可を求める
    private fun requestLocationPermission() {

        if (ActivityCompat.shouldShowRequestPermissionRationale(this,
                        Manifest.permission.WRITE_EXTERNAL_STORAGE)) {
            ActivityCompat.requestPermissions(this,
                    arrayOf(Manifest.permission.WRITE_EXTERNAL_STORAGE), REQUEST_PERMISSION)

        } else {
            val toast = Toast.makeText(this, "アプリ実行に許可が必要です", Toast.LENGTH_SHORT)
            toast.show()

            ActivityCompat.requestPermissions(this,
                    arrayOf(Manifest.permission.WRITE_EXTERNAL_STORAGE),
                    REQUEST_PERMISSION)

        }
    }

}


fun saveCapture(view: View, file: File) {
    // キャプチャを撮る

    val capture: Bitmap = getViewCapture(view)!!

    //幅と高さの取得
    val imageWidth = capture.width
    val imageHeight = capture.height

//トリミングする幅、高さ、座標の設定
    val nWidth = (imageWidth * 1.0f).toInt()
    val nHeight = (imageHeight * 1.0f).toInt()
    val startX = 0
    val startY = 0

//トリミングしたBitmapの作成
    val trimCapture = Bitmap.createBitmap(capture, startX, startY, nWidth, nHeight, null, true)

    try {
        val fos = FileOutputStream(file, false)
        // 画像のフォーマットと画質と出力先を指定して保存
        trimCapture.compress(Bitmap.CompressFormat.JPEG, 100, fos)
        fos.flush()
        fos.close()

    }catch (e: Exception){

        e.printStackTrace()
    }
}


fun getViewCapture(view: View): Bitmap? {
    view.isDrawingCacheEnabled = true

    // Viewのキャプチャを取得
    val cache = view.drawingCache ?: return null

    val screenShot = Bitmap.createBitmap(cache)
    view.isDrawingCacheEnabled = false
    return screenShot
}

お恥ずかしながら、結構長い時間理由がわからずにいます。。。
引き続き原因を探しますがアドバイスいただければ幸いです。

何卒よろしくお願いいたします!

  • 気になる質問をクリップする

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

質問への追記・修正の依頼

  • aja

    2018/12/29 18:01

    Android 7.0だとAPI24なのですが...

    キャンセル

  • akawo

    2018/12/30 10:05

    AndroidのバージョンごとにAPIレベルってきまっているんですね!ありがとうございます。
    ただ、android studioの実機にてデバッグする際にはAndroid 7.0, API 22と表示されるんです、、、

    一旦、permissionの確認コード等追記して、引き続き調査します!

    キャンセル

まだ回答がついていません

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

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

関連した質問

同じタグがついた質問を見る