외부 패스를 관리해보자
프로바이더를 사용해 저장 권한을 실행하기 위한 준비
res > xml 폴더에 path.xml 생성
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>
<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>
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
}