OSDN Git Service

c70e20a82b0e20c85aee417187a5b8d16f3d8920
[gokigen/mangle.git] / app / src / main / java / jp / osdn / gokigen / gokigenassets / utils / imagefile / ImageStoreExternalLegacy.kt
1 package jp.osdn.gokigen.gokigenassets.utils.imagefile
2
3 import android.content.ContentValues
4 import android.os.Environment
5 import android.provider.MediaStore
6 import android.util.Log
7 import android.widget.Toast
8 import androidx.camera.core.ImageCapture
9 import androidx.camera.core.ImageCaptureException
10 import androidx.core.content.ContextCompat
11 import androidx.fragment.app.FragmentActivity
12 import jp.osdn.gokigen.gokigenassets.constants.IStringResourceConstantConvert.Companion.ID_LABEL_APP_LOCATION
13 import jp.osdn.gokigen.gokigenassets.constants.IStringResourceConstantConvert.Companion.ID_MESSAGE_LABEL_CAPTURE_SUCCESS
14 import java.io.File
15 import java.text.SimpleDateFormat
16 import java.util.*
17
18 class ImageStoreExternalLegacy(private val context: FragmentActivity) : IImageStore
19 {
20     private fun getExternalOutputDirectory(): File
21     {
22         @Suppress("DEPRECATION") val directoryPath = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM).path + "/" + context.getString(ID_LABEL_APP_LOCATION) + "/"
23         val target = File(directoryPath)
24         try
25         {
26             target.mkdirs()
27         }
28         catch (e: Exception)
29         {
30             e.printStackTrace()
31         }
32         Log.v(TAG, "  ----- RECORD Directory PATH : $directoryPath -----")
33         return (target)
34     }
35
36     override fun takePhoto(id : Int, imageCapture : ImageCapture?) : Boolean
37     {
38         if ((!isExternalStorageWritable())||(imageCapture == null))
39         {
40             Log.v(TAG, " takePhotoExternal() : cannot write image to external.")
41             return (false)
42         }
43
44         Log.v(TAG, " takePhotoExternal()")
45         try
46         {
47             val outputDir = getExternalOutputDirectory()
48
49             val mimeType = "image/jpeg"
50             val photoFile = "P" + SimpleDateFormat(FILENAME_FORMAT, Locale.US).format(System.currentTimeMillis()) + "_" + id + ".jpg"
51
52             val extStorageUri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI
53
54             val values = ContentValues()
55             values.put(MediaStore.Images.Media.TITLE, photoFile)
56             values.put(MediaStore.Images.Media.DISPLAY_NAME, photoFile)
57             values.put(MediaStore.Images.Media.MIME_TYPE, mimeType)
58             @Suppress("DEPRECATION")
59             values.put(MediaStore.Images.Media.DATA, outputDir.absolutePath + File.separator + photoFile)
60
61             val resolver = context.contentResolver
62             val imageUri = resolver.insert(extStorageUri, values)?: return (false)
63             resolver.update(imageUri, values, null, null)
64
65             /////////////////////////////
66             //val cursor = resolver.query(imageUri, null, null, null, null)
67             //DatabaseUtils.dumpCursor(cursor)
68             //cursor!!.close()
69             /////////////////////////////
70
71             val openStream = resolver.openOutputStream(imageUri) ?: return (false)
72             val outputOptions = ImageCapture.OutputFileOptions.Builder(openStream).build()
73
74             imageCapture.takePicture(
75                 outputOptions,
76                 ContextCompat.getMainExecutor(context),
77                 object : ImageCapture.OnImageSavedCallback
78                 {
79                     override fun onError(e: ImageCaptureException)
80                     {
81                         Log.e(TAG, "Photo capture failed: ${e.message} ", e)
82                         e.printStackTrace()
83                     }
84
85                     override fun onImageSaved(output: ImageCapture.OutputFileResults)
86                     {
87                         val msg = context.getString(ID_MESSAGE_LABEL_CAPTURE_SUCCESS) + " ${outputDir.canonicalPath}/$photoFile"
88                         Toast.makeText(context.baseContext, msg, Toast.LENGTH_SHORT).show()
89                         Log.v(TAG, msg)
90                     }
91                 })
92         }
93         catch (e : Exception)
94         {
95             e.printStackTrace()
96             return (false)
97         }
98         return (true)
99     }
100
101     private fun isExternalStorageWritable(): Boolean
102     {
103         return (Environment.getExternalStorageState() == Environment.MEDIA_MOUNTED)
104     }
105
106     companion object
107     {
108         private val TAG = ImageStoreExternalLegacy::class.java.simpleName
109         private const val FILENAME_FORMAT = "yyyyMMdd_HHmmss"
110     }
111 }