728x90
해당 게시글에서는 이전에 MainActivity에서 구현한 내용을 바탕으로 새로운 인텐트에 정보를 전달하는 과정을 구현하였습니다.
ImgActivity
이미지 확인 (향후 업데이트할 사항)
- 이미지에 대한 정보를 확인할 수 있음
- 이전 버튼을 누르면 MainAcitivity로 이동
bulid.gradle, file_paths.xml 은 이전 포스트와 동일합니다.
MainActivity,kt
package com.example.cameraandgallery
import android.Manifest
import android.content.Intent
import android.graphics.Bitmap
import android.graphics.drawable.BitmapDrawable
import android.net.Uri
import android.os.Bundle
import android.os.Environment
import android.view.View
import android.widget.ImageView
import android.widget.Toast
import androidx.activity.result.ActivityResultLauncher
import androidx.activity.result.contract.ActivityResultContracts
import androidx.appcompat.app.AppCompatActivity
import androidx.core.content.FileProvider
import com.example.cameraandgallery.databinding.ActivityMainBinding
import java.io.ByteArrayOutputStream
import java.io.File
class MainActivity : AppCompatActivity() {
var photoUri:Uri? = null
lateinit var cameraPermission:ActivityResultLauncher<String>
lateinit var storagePermission:ActivityResultLauncher<String>
lateinit var cameraLauncher:ActivityResultLauncher<Uri>
lateinit var galleryLauncher:ActivityResultLauncher<String>
val binding by lazy { ActivityMainBinding.inflate(layoutInflater) }
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(binding.root)
storagePermission = registerForActivityResult(ActivityResultContracts.RequestPermission()) { isGranted ->
if(isGranted) {
setViews()
} else {
Toast.makeText(baseContext, "외부저장소 권한을 승인해야 앱을 사용할 수 있습니다.", Toast.LENGTH_LONG).show()
finish()
}
}
cameraPermission = registerForActivityResult(ActivityResultContracts.RequestPermission()) { isGranted ->
if(isGranted) {
openCamera()
} else {
Toast.makeText(baseContext, "카메라 권한을 승인해야 카메라를 사용할 수 있습니다.", Toast.LENGTH_LONG).show()
}
}
cameraLauncher = registerForActivityResult(ActivityResultContracts.TakePicture()) { isSuccess ->
if(isSuccess) { binding.imagePreview.setImageURI(photoUri) }
}
galleryLauncher = registerForActivityResult(ActivityResultContracts.GetContent()) { uri ->
binding.imagePreview.setImageURI(uri)
}
storagePermission.launch(Manifest.permission.WRITE_EXTERNAL_STORAGE)
}
fun setViews() {
binding.buttonCamera.setOnClickListener {
cameraPermission.launch(Manifest.permission.CAMERA)
if (binding.imagePreview != null) {
binding.btnOkay.visibility = View.VISIBLE
nextIntent()
}
}
binding.buttonGallery.setOnClickListener {
openGallery()
if (binding.imagePreview != null) {
binding.btnOkay.visibility = View.VISIBLE
nextIntent()
}
}
}
fun openCamera() {
val photoFile = File.createTempFile(
"IMG_",
".jpg",
getExternalFilesDir(Environment.DIRECTORY_PICTURES)
)
photoUri = FileProvider.getUriForFile(
this,
"${packageName}.provider",
photoFile
)
cameraLauncher.launch(photoUri)
}
fun openGallery() {
galleryLauncher.launch("image/*")
}
fun nextIntent(){
binding.btnOkay.setOnClickListener{
val nextIntent = Intent(this, ImgActivity::class.java)
// 이미지 데이터를 ImgActivity로 옮김
val stream = ByteArrayOutputStream()
val bitmap = (binding.imagePreview.getDrawable() as BitmapDrawable).bitmap
val scale = (1024 / bitmap.width.toFloat())
val image_w = (bitmap.width * scale).toInt()
val image_h = (bitmap.height * scale).toInt()
val resize = Bitmap.createScaledBitmap(bitmap, image_w, image_h, true)
resize.compress(Bitmap.CompressFormat.JPEG, 100, stream)
val byteArray = stream.toByteArray()
nextIntent.putExtra("image", byteArray)
startActivity(nextIntent)
}
}
}
데이터를 메인 액티비티에서 이미지인텐트( 전송할 인텐트 ) 로 전송하는 기능을 짠 함수입니다.
해당 함수를 구현하고 확인 버튼(btnOkay) 를 누르면 다음 인텐트로 가는 함수 입니다.
ImgActicity.kt
package com.example.cameraandgallery
import android.content.Intent
import android.graphics.BitmapFactory
import android.os.Bundle
import android.view.View
import android.widget.Button
import android.widget.ImageView
import androidx.appcompat.app.AppCompatActivity
class ImgActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_img)
val btn_gotomain = findViewById<View>(R.id.btn_gotomain) as Button
val imagePreview = findViewById<View>(R.id.imagePreview) as ImageView
val byteArray = intent.getByteArrayExtra("image")
val bitmap = BitmapFactory.decodeByteArray(byteArray, 0, byteArray!!.size)
imagePreview.setImageBitmap(bitmap)
btn_gotomain.setOnClickListener{
val intent = Intent(applicationContext,MainActivity::class.java)
startActivity(intent)
}
}
}
btn_gotomain (이전) 버튼을 누르면 다시 메인 액티비티로 전환됩니다.
activity_img.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".ImgActivity"
android:orientation="vertical">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_weight="1">
<ImageView
android:id="@+id/imagePreview"
android:layout_width="match_parent"
android:layout_height="432dp" />
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="250dp"
android:layout_weight="1"
android:orientation="vertical">
<TextView
android:id="@+id/textView3"
android:layout_width="match_parent"
android:layout_height="45dp"
android:text="txt_placeName"
android:textSize="34sp" />
<TextView
android:id="@+id/textView4"
android:layout_width="match_parent"
android:layout_height="208dp"
android:text="txt_placeContent"
android:textSize="20sp" />
</LinearLayout>
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="horizontal">
<Button
android:id="@+id/btn_gotomain"
android:layout_width="123dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="이전" />
</LinearLayout>
</LinearLayout>
AndroidManifast.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.cameraandgallery">
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-feature android:name="android.hardware.camera" />
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="AI 랜드마크 인식"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/Theme.CameraAndGallery">
<activity
android:name=".ImgActivity"
android:exported="false" />
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<provider
android:name="androidx.core.content.FileProvider"
android:authorities="${applicationId}.provider"
android:exported="false"
android:grantUriPermissions="true">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/file_paths" />
</provider>
</application>
</manifest>
이전 포스트와 동일한 매니패스트 파일에 이미지 액티비티를 추가해주었습니다.
전체 구현 과정
* 해당 코드가 안드로이드 버전 10부터 실행이 안되는 오류가 있습니다.
해당 오류의 경우 이미지 uri 주소(이미지절대경로)를 String 으로 변환하여 다음 인텐트로 해당 String 변수의 값을 전달하면 해결됩니다.
728x90
'App & Web > Android' 카테고리의 다른 글
[코틀린] 파이어베이스 리얼타임 데이터베이스 업로드 (0) | 2022.10.11 |
---|---|
[코틀린] 이미지 이진화 하기 (0) | 2022.10.11 |
코틀린 OpenCV (0) | 2022.10.11 |
[Android] 파이어 베이스 연동 안될 때 해결 방법 - 안드로이드 스튜디오 (0) | 2022.09.28 |
[Android] 카메라 & 갤러리 기능으로 이미지 불러오기 - Kotlin 코틀린 (0) | 2022.09.16 |