path 외부파일에 등록 & 이미지 data 저장하기

소정·2024년 3월 25일
0

Kotlin

목록 보기
26/27

외부 패스를 관리해보자
프로바이더를 사용해 저장 권한을 실행하기 위한 준비

  1. res > xml 폴더에 path.xml 생성

  2. path.xml에 외부 경로 작성

<?xml version="1.0" encoding="utf-8"?>
<paths xmlns:android="http://schemas.android.com/apk/res/android">
    <external-path
        name="capture"
        path="Android/data/com.mbsysoft.myapplication/files"/>

</paths>
  1. 매니패스트에 provider 추가 (4대 컴포넌트 이기 때문에)
  • meta-data에 위에서 작성한 path.xml 연결
<provider
            android:authorities="com.mbsysoft.myapplication.fileprovider"
            android:name="androidx.core.content.FileProvider"
            android:exported="false"
            android:grantUriPermissions="true">
            <meta-data
                android:name="android.support.FILE_PROVIDER_PATHS"
                android:resource="@xml/path"
                />
            <!--
            - authorities : 콘텐츠 제공자에서 제공되는 데이터를 식별하는 URI 권한을 하나 이상 보여주는 목록,
            일반적으로 이름은 제공자를 구현하는 ContentProvider 서브클래스 이름이다.
            기본값 없음, 권한을 하나 이상 지정해 줘야함
            - exported : 다른 앱에서 콘텐츠 제공자를 사용할 수 있는지 여부
            - grantUriPermissions : 일반적으로는 콘텐츠 제공자 데이터에 엑세스할 권한이 없는 사용자에게 액세스 부여하는 것
            readPermission, writePermission, permission, exported 속성에 따른 제한을 일시적으로 사용할 수 있는지 여부
            -->
        </provider>
  1. 이미지 비트맵으로 저장 하는 매소드 작성
private fun getBitmapFromView(view: View) : Bitmap {
        val returnBitmap = Bitmap.createBitmap(view.width,
            view.height, Bitmap.Config.ARGB_8888) //저장할 사진의 가로, 세로, Config

        val canvas = Canvas(returnBitmap)
        val bgDrawable = view.background
        if (bgDrawable != null) {
            bgDrawable.draw(canvas)
        } else {
            canvas.drawColor(Color.WHITE)
        }

        view.draw(canvas)

        return returnBitmap
    }

    private suspend fun saveBitmapFile(mBitmap: Bitmap?):String {
        var result = "" //이미지 저장할 변수
        withContext(Dispatchers.IO) {
            if (mBitmap != null) {
                try {// OutputStream 을 사용할 땐 오류에 대비해 try문에 쓴다
                    val bytes = ByteArrayOutputStream() //새로운 바이트 배열 출력 스트림을 생성하는 이미지를 출력하는 것
                    mBitmap.compress(Bitmap.CompressFormat.PNG, 90, bytes)// 사용하고 싶은 포맷인 quality와 OutputStream 전달

                    val f = File(externalCacheDir?.absoluteFile.toString() +
                        File.separator + "kidDrawingApp_" + System.currentTimeMillis() / 1000 + ".png" //저장 위치 지정
                    )

                    val fo = FileOutputStream(f)
                    fo.write(bytes.toByteArray())
                    fo.flush()
                    fo.close()

                    result = f.absolutePath

                    runOnUiThread {
                        if(result.isNotEmpty()) {
                            Toast.makeText(this@MainActivity, "$result", Toast.LENGTH_SHORT).show()
                        } else {
                            Toast.makeText(this@MainActivity, "문제 생심", Toast.LENGTH_SHORT).show()
                        }
                    }
                } catch (e : Exception) {
                    result = ""
                    e.printStackTrace()
                }
            }
        }

        return result
    }
profile
보조기억장치

0개의 댓글