개발/Android
[프로젝트] 8일차 - 캡처 & FileProvider & 공유
레란희
2021. 9. 27. 21:13
1. 화면 캡처
원래는 view.getDrawingCache()를 사용했으나 이게 deprecated 되어서 다른 방법으로 캡처 기능을 구현하였다.
https://newbedev.com/view-getdrawingcache-is-deprecated-in-android-api-28
아래는 뷰를 캡쳐해서 저장된 파일의 경로를 가져오는 capture 메소드
fun capture(): String? {
val now = SimpleDateFormat("yyyyMMdd_hhmmss").format(Date(System.currentTimeMillis()))
val mPath = cacheDir.absolutePath+"/$now.jpg"
var bitmap: Bitmap? = null
val captureView = window.decorView.rootView //캡처할 뷰
bitmap = Bitmap.createBitmap(captureView.width, captureView.height, Bitmap.Config.ARGB_8888)
var canvas = Canvas(bitmap)
captureView.draw(canvas)
if(bitmap == null) {
return null
}else {
val imageFile = File(mPath)
val outputStream = FileOutputStream(imageFile)
outputStream.use {
bitmap.compress(Bitmap.CompressFormat.JPEG, 100, outputStream)
outputStream.flush()
}
}
return mPath
}
2. FileProvider
https://keykat7.blogspot.com/2021/02/android-fileprovider.html
나는 캐시 디렉토리 안에 screenshots라는 폴더 안에 스크린샷을 저장하려고 했다.
그런데 파일에서 Uri를 얻기 위해서 FileProvider를 이용하여야 한다.
① resource에 fileprovider.xml 추가
<paths>
<cache-path
name="screenshots"
path="." />
</paths>
② Manifest.xml에 코드 추가
<application
...
<provider
android:name="androidx.core.content.FileProvider"
android:authorities="com.test.packagename.fileprovider"
android:grantUriPermissions="true"
android:exported="false">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/fileprovider" />
</provider>
...
/>
③ 이미지 공유하는 코드 추가
if(captureFile == null) {
//캡쳐 실패한 경우
}else{
try {
val intent = Intent(Intent.ACTION_SEND)
val fileUri : Uri? = FileProvider.getUriForFile(getContext(), "$packageName.fileprovider", captureFile!!)
fileUri?.let {
intent.putExtra(Intent.EXTRA_STREAM, fileUri)
intent.type = "image/*"
intent.flags = Intent.FLAG_GRANT_READ_URI_PERMISSION
startActivity(intent)
}
}catch(e: ActivityNotFoundException) {
//공유할 수 있는 어플리케이션이 없을 때 처리
}
}