[Android Studio] 이미지를 번역하는 앱 만들기

Jean·2023년 8월 9일
0

@OptIn(ExperimentalMaterial3Api::class)
class MainActivity : ComponentActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContent {
            TranslationTheme {
                // A surface container using the 'background' color from the theme
                Surface(
                    modifier = Modifier.fillMaxSize(),
                    color = MaterialTheme.colorScheme.background
                ) {
                    //번역 라이브러리 변수
                    val recognizer = TextRecognition.getClient(TextRecognizerOptions.DEFAULT_OPTIONS)
                    val enKoTranslator = remember {
                        val options = TranslatorOptions.Builder()
                            .setSourceLanguage(TranslateLanguage.ENGLISH)
                            .setTargetLanguage(TranslateLanguage.KOREAN)
                            .build()
                        Translation.getClient(options)
                    }
                    var enabled by remember {
                        mutableStateOf(false)
                    }
                    LaunchedEffect(Unit) {
                        val conditions = DownloadConditions.Builder()
                            .requireWifi()
                            .build()
                        enKoTranslator.downloadModelIfNeeded(conditions)
                            .addOnSuccessListener {
                                enabled = true
                            }
                            .addOnFailureListener { exception ->
                            }
                    }
                    //사진 선택 도구 변수
                    var context = LocalContext.current
                    var selectUri by remember { mutableStateOf<Uri?>(null) }
                    val launcher = rememberLauncherForActivityResult(
                        contract = ActivityResultContracts.PickVisualMedia(),
                        onResult = { uri ->
                            selectUri = uri
                        }
                    )
                    //번역 Compose 변수
                    var textEn by remember { mutableStateOf("") }
                    var textTranslated by remember { mutableStateOf("") }

                    Column(horizontalAlignment = Alignment.CenterHorizontally) {
                        Text(
                            text = "퀄리티 높은 무료 번역",
                            fontWeight = FontWeight.Bold,
                            fontSize = 20.sp,
                            modifier = Modifier
                                .padding(20.dp)
                                .align(Alignment.CenterHorizontally)
                        )
                        Box(
                            modifier = Modifier
                                .background(color = Color.LightGray)
                                .fillMaxWidth()
                        )
                        TextField(
                            value = textEn,
                            onValueChange = { textEn = it },
                            label = { Text(text = "번역할 내용을 입력하세요.") },
                            placeholder = { Text(text = "") },
                            maxLines = 10,
                            textStyle = TextStyle(color = Color.Black),
                            modifier = Modifier
                                .padding(30.dp)
                                .height(180.dp)
                                .fillMaxWidth()
                        )

                        Spacer(
                            modifier = Modifier
                                .size(20.dp)
                        )
                        Row {
                            Button(
                                onClick = {
                                    enKoTranslator.translate(textEn)
                                        .addOnSuccessListener { translatedText ->
                                            textTranslated = translatedText
                                        }
                                        .addOnFailureListener { exception ->
                                        }
                                },
                                enabled = enabled,
                                colors = ButtonDefaults.buttonColors(
                                    containerColor = Color(0xff4B5F93),
                                    contentColor = Color.White
                                ),
                            ) {
                                Text(text = "Translate")
                            }
                            Spacer(
                                modifier = Modifier
                                    .padding(5.dp)
                            )

                            Button(
                                onClick = {
                                    launcher.launch(PickVisualMediaRequest(ActivityResultContracts.PickVisualMedia.ImageOnly))
                                },
                                colors = ButtonDefaults.buttonColors(
                                    containerColor = Color(0xff4B5F93),
                                    contentColor = Color.White
                                )
                            ) {
                                Text(text = "Translate Image")
                            }

                        }
                        Spacer(
                            modifier = Modifier
                                .size(30.dp)
                        )
                        Box(
                            modifier = Modifier
                                .background(color = Color(0xffE1E2EC))
                                .width(320.dp)
                                .height(250.dp)
                                .padding(5.dp)
                        ) {
                            Column {
                                Text(text = "번역 결과", color = Color.Gray, fontSize = 15.sp)
                                Text(text = "$textTranslated")

                            }
                        }
                        Spacer(
                            modifier = Modifier
                                .padding(10.dp)
                        )
                        Box(
                            modifier = Modifier
                                .fillMaxWidth()
                        ) {
                            Column {
                                Image(
                                    painter = painterResource(id = R.drawable.ad),
                                    contentDescription = null
                                )
                                selectUri?.let {
                                    val bitmap =
                                        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
                                            ImageDecoder.decodeBitmap(
                                                ImageDecoder.createSource(
                                                    context.contentResolver, it
                                                )
                                            )
                                        } else {
                                            MediaStore.Images.Media.getBitmap(
                                                context.contentResolver,
                                                it
                                            )
                                        }
                                    Image(bitmap = bitmap.asImageBitmap(), contentDescription = "")

                                    //이미지 번역 변수
                                    try {
                                        selectUri?.let {
                                            val image = InputImage.fromFilePath(context, it)
                                            recognizer.process(image)
                                                .addOnSuccessListener { visionText ->
                                                    textEn = visionText.text
                                                    // Task completed successfully
                                                    // ...
                                                }
                                                .addOnFailureListener { e ->
                                                    // Task failed with an exception
                                                    // ...
                                                }
                                        }
                                    } catch (e: IOException) {
                                        e.printStackTrace()
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}

링크 :
https://developers.google.com/ml-kit/vision/text-recognition/v2/android?hl=ko

profile
아 왜 안돼

0개의 댓글