이번 주제는 제목 그대로 이미지 파일을 2가지 방법으로 소개하는 것이다.
근데 굳이 2가지 방법을..?
나도 굳이 같은 기능을 2가지 방법을 생각하면서 개발하고 싶지는 않았다.
처음 프로젝트에서 사용한 방법은 ShareCompat을 사용하는 것이었다.
최대한 Jetpack 라이브러리를 활용하고 싶었고 그 욕심이 철저히 반영된 코드였다.
물론 기능도 무사히 동작했다.
하지만 또다른 프로젝트는 android support 버전을 사용 중이다.
(Jetpack이 없다는 말이다.)
따라서 Jetpack ShareCompat을 사용할 수 없었고, 그에 따라 기본 Intent를 사용해 처리해야만 했다.
support library에도 ShareCompat은 있지만 해당 클래스의 동작이 동일하다는 보장을 하기 어렵다.
(해당 내용을 뒤적거릴 시간이 없었다.)
이제 그 방법에 대해 자세히 소개해보겠다.
1. ShareCompat 사용하기
ShareCompat을 사용하려면 선행되어야 하는 절차가 있다.
먼저 FileProvider 설정을 해주어야한다.
res/xml 폴더에 xml을 하나 추가한다.
나는 developer 사이트의 이름을 그대로 사용해 filepaths.xml로 지정했다.
<paths>
<files-path path="temp/" name="." />
</paths>
경로는 본인이 어떤 디렉토리를 사용하는 지에 따라 paths 태그 내에 선언해주면 된다.
이 때 paths 태그 내에는 여러 경로를 지정할 수 있다.
현재 내 글에서의 예시를 보면 앱 내부 저장소 files 폴더의
하위 디렉토리인 temp 폴더의 파일을 공유하도록 설정한 것이다.
이후 Manifest.xml의 application 태그 내부에 해당 provider를 선언해준다.
<provider
android:name="androidx.core.content.FileProvider"
android:authorities="com.bonustrack02.sample.fileprovider"
android:grantUriPermissions="true"
android:exported="false">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/filepaths" />
</provider>
이제 ShareCompat을 사용해보자.
val imgFile = File(context.filesDir, "someImage.png")
val someImg = FileProvider.getUriForFile(context, "${context.packageName}.fileprovider", imgFile)
ShareCompat.IntentBuilder(context)
.setType("image/*")
.setSubject("Title")
.addStream(someImg)
.startChooser()
먼저 저장한 이미지 파일을 File 객체로 생성한다.
그리고 FileProvider를 통해 File의 Uri를 가져오기 위해 getUriForFile 함수를 사용한다.
이렇게 가져온 Uri를 addStream 함수로 전달한다.
마지막으로 chooser를 실행하면 된다.
2. 기본 Intent 사용하기
기본 Intent를 사용하는 경우에는 ShareCompat을 사용할 때처럼 FileProvider 관련 설정을 해줘야 할 필요는 없다.
곧장 코드를 보자.
Intent shareIntent = new Intent(Intent.ACTION_SEND);
shareIntent.setType("image/*");
shareIntent.putExtra(Intent.EXTRA_STREAM, Uri.parse(getFilesDir() + "/someImage.png"));
startActivity(Intent.createChooser(shareIntent, "Image"));
Intent의 액션값을 SEND로 설정하고 암시적 인텐트로 만든다.
타입과 Uri를 설정하고 createChooser를 호출해 Intent 객체를 만들어 startActivity에 전달한다.
마무리
Jetpack을 사용하지 않는 회사는 많이 없을 것이라고 생각하지만,
ShareCompat과 같은 클래스를 사용하지 않을 수도 있으니
다른 방법을 알아두는 것도 언젠가는 도움이 되지 않을까 생각한다.
따라서, 처한 상황에 따라 다른 방법을 찾는 것은 정말 중요하다는 것을 다시금 깨달았다.
참조
https://developer.android.com/training/secure-file-sharing/setup-sharing?hl=ko
https://developer.android.com/training/sharing/send?hl=ko#java
'Android' 카테고리의 다른 글
Android add library using toml (0) | 2024.11.27 |
---|---|
Android QR Code Generation (0) | 2024.11.26 |
Android Watchdog 기능 추가하기(OS 9) (0) | 2024.11.25 |
Android Phone Number Format(자동 하이픈 추가) (0) | 2024.11.24 |
Android Compose WebView PullToRefresh 기능 구현하기 (0) | 2024.11.19 |