개발/Android

[프로젝트] 8일차 - 캡처 & FileProvider & 공유

레란희 2021. 9. 27. 21:13

1. 화면 캡처

원래는 view.getDrawingCache()를 사용했으나 이게 deprecated 되어서 다른 방법으로 캡처 기능을 구현하였다.

 

https://newbedev.com/view-getdrawingcache-is-deprecated-in-android-api-28

 

Programming tutorials | Newbedev

Checkout new tutorials and guides for programming languages Javascript, Python, Java, Golang, C++, PHP

newbedev.com

아래는 뷰를 캡쳐해서 저장된 파일의 경로를 가져오는 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) {
        //공유할 수 있는 어플리케이션이 없을 때 처리
    }
}