Development record of developer who study hard everyday.

, , ,

안드로이드 미디어스토어로 공유저장소에 파일 저장하기

 미디어스토어로 공유저장소에 파일 저장하기


회사 프로젝트(기능 추가)를 진행하는데 난관에 부딪혔다.

문제는 안드로이드 10부터 변경된 저장소개념이였다.

안드로이드 10(Q) 이전에는 앱의 외부저장소에 사용자가 얼만든지 접근이 가능했었다.

하지만 안드로이드 10 이후부터는 Scoped Storage 개념이 도입되면서 앱의 내부저장소와 외부저장소는 사용자가 접근할 수가 없다.

이 프로젝트에서는 데이터를 저장하는 기능이 있다.

원래는 앱의 외부저장소에 저장을 시키고 사용자가 usb로 핸드폰을 연결해서 측정 데이터를 export한다.

하지만 이제는 그럴 수가 없다.

그래서 나는 앱의 공유저장소(공유폴더)에 앱을 저장시키기로 했다.

공식문서는 여기있다.

공유저장소에 파일 쓰기

간단하게 설명하자면, SelectorUI를 인텐트로 띄워서 사용자가 파일이나 디렉토리를 만들 위치를 지정해준다.

위치를 Uri로 받아서 파일이나 디렉토리를 만들면 된다.

공유 저장소에 디렉토리 만들기 링크

공유저장소에 파일 만들기 링크

잘 구현해서 개발 블로그에도 정리해두었다.

그러나.... 문제가 발생했다.

고객사 측에서 이 방식이 너무 맘에 안든다는 것이다....

편법을 써서라도 이전처럼(인텐트 안 띄우는 방식) 구현해달라고 요청이 왔다.

특히, 예시로 카카오톡은 파일 저장할 때 인텐트 안 띄우는데 왜 안되냐고.....

그래서 여기저기 찾아보니까 미디어 스토어로 파일을 공유저장소에 저장할 수 있다는 것을 알았다.

다만, 안드로이드 공식문서상 권장사항은 아니였다.

일단, 시도해봤고 성공했다.ㅋㅋ

try {
val contentValues = ContentValues()
contentValues.put(MediaStore.MediaColumns.DISPLAY_NAME, "appg")    //1
contentValues.put(MediaStore.MediaColumns.MIME_TYPE, "text/plain")    //2
contentValues.put(MediaStore.MediaColumns.RELATIVE_PATH, Environment.DIRECTORY_DOCUMENTS.plus("/APPG"))    //3

val uri = contentResolver.insert(
MediaStore.Files.getContentUri("external"),
contentValues
)    //4

val outputStream = uri?.let { _uri -> contentResolver.openOutputStream(_uri) }    //5
outputStream?.write("This is appg test file modified2".toByteArray())
outputStream?.close()

Log.d(TAG, "writing file is succeeded")
} catch (e: IOException) {
e.printStackTrace()
Log.d(TAG, "writing file is failed")
}

방법은 위 코드와 같다.

1-> 파일 이름

2-> 파일 형식

3-> 파일 저장 위치(상대적)

4-> 1,2,3 정보로 저장

5-> 파일 쓰기

이렇게하면 미디어 스토어를 활용하여 데이터를 공유저장소(공유폴더)인 Documents 폴더에 저장할 수 있다.

물론, Documents, Downloads, Movies 등등 다른 공유폴더에도 저장가능하니까 참고해서 코드를 짜면 된다.


✋개인적으로 궁금해서 미디어스토어를 활용하여 공유저장소(공유폴더)에 있는 파일을 불러올 수 있을지 시도해보았다.

하지만 실패했다.

실패이유는 알 수 없다. 원래 안드로이드 공식문서상 권장사항이 아니니까...

미디어 스토어는 미디어파일을 다루는 API이다.

다만, 내 앱에서 만든 파일은 미디어 스토어를 활용해서 읽어올 수 있었다.





. ( 대목) here

Share:
Location: 대한민국 서울특별시

댓글 없음:

댓글 쓰기