howlongtobeat-android/app/src/main/java/be/kuleuven/howlongtobeat/google/GoogleVisionClient.kt

53 lines
2.1 KiB
Kotlin

package be.kuleuven.howlongtobeat.google
import android.graphics.Bitmap
import be.kuleuven.howlongtobeat.asEncodedGoogleVisionImage
import be.kuleuven.howlongtobeat.cartridges.Cartridge
import com.google.api.client.http.javanet.NetHttpTransport
import com.google.api.client.json.gson.GsonFactory
import com.google.api.services.vision.v1.Vision
import com.google.api.services.vision.v1.VisionRequestInitializer
import com.google.api.services.vision.v1.model.AnnotateImageRequest
import com.google.api.services.vision.v1.model.BatchAnnotateImagesRequest
import com.google.api.services.vision.v1.model.BatchAnnotateImagesResponse
import com.google.api.services.vision.v1.model.Feature
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.withContext
class GoogleVisionClient {
// TODO encrypt and store externally: https://cloud.google.com/docs/authentication/api-keys?hl=en&visit_id=637642790375688006-1838986332&rd=1
private val vision = Vision.Builder(NetHttpTransport(), GsonFactory.getDefaultInstance(), null)
.setVisionRequestInitializer(VisionRequestInitializer("AIzaSyCaMjQQOY7508y95riDhr25fsrqe3m2JW0"))
.build()
suspend fun findCartCodeViaGoogleVision(cameraSnap: Bitmap): String? {
var response: BatchAnnotateImagesResponse
withContext(Dispatchers.IO) {
println("Encoding image...")
val sml2Data = cameraSnap.asEncodedGoogleVisionImage()
println("Done, uploading image...")
val req = AnnotateImageRequest().apply {
features = listOf(Feature().apply {
type = "TEXT_DETECTION"
maxResults = 10
})
image = sml2Data
}
val batch = BatchAnnotateImagesRequest().apply {
requests = listOf(req)
}
response = vision.images().annotate(batch).execute()
}
if(response.responses.isEmpty()) {
return null
}
val gbId = response.responses.get(0).textAnnotations.filter {
Cartridge.isValid(it.description)
}.firstOrNull()
return gbId?.description ?: null
}
}