[Android] 이미지 데이터를 다음 화면(서브 인텐트)로 옮기기 - Kotlin 코틀린

2022. 9. 16. 22:00·App & Web/Android
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
'App & Web/Android' 카테고리의 다른 글
  • [코틀린] 이미지 이진화 하기
  • 코틀린 OpenCV
  • [Android] 파이어 베이스 연동 안될 때 해결 방법 - 안드로이드 스튜디오
  • [Android] 카메라 & 갤러리 기능으로 이미지 불러오기 - Kotlin 코틀린
sillon
sillon
꾸준해지려고 합니다..
    반응형
  • sillon
    sillon coding
    sillon
  • 전체
    오늘
    어제
    • menu (614)
      • notice (2)
      • python (68)
        • 자료구조 & 알고리즘 (23)
        • 라이브러리 (19)
        • 기초 (8)
        • 자동화 (14)
        • 보안 (1)
      • coding test - python (301)
        • Programmers (166)
        • 백준 (76)
        • Code Tree (22)
        • 기본기 문제 (37)
      • coding test - C++ (5)
        • Programmers (4)
        • 백준 (1)
        • 기본기문제 (0)
      • 공부정리 (5)
        • 신호처리 시스템 (0)
        • Deep learnig & Machine lear.. (41)
        • Data Science (18)
        • Computer Vision (17)
        • NLP (40)
        • Dacon (2)
        • 모두를 위한 딥러닝 (강의 정리) (4)
        • 모두의 딥러닝 (교재 정리) (9)
        • 통계 (2)
      • HCI (23)
        • Haptics (7)
        • Graphics (11)
        • Arduino (4)
      • Project (21)
        • Web Project (1)
        • App Project (1)
        • Paper Project (1)
        • 캡스톤디자인2 (17)
        • etc (1)
      • OS (10)
        • Ubuntu (9)
        • Rasberry pi (1)
      • App & Web (9)
        • Android (7)
        • javascript (2)
      • C++ (5)
        • 기초 (5)
      • Cloud & SERVER (8)
        • Git (2)
        • Docker (1)
        • DB (4)
      • Paper (7)
        • NLP Paper review (6)
      • 데이터 분석 (0)
        • GIS (0)
      • daily (2)
        • 대학원 준비 (0)
      • 영어공부 (6)
        • job interview (2)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    Python
    백준
    programmers
    소수
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
sillon
[Android] 이미지 데이터를 다음 화면(서브 인텐트)로 옮기기 - Kotlin 코틀린
상단으로

티스토리툴바