Study/Java, Android

Uri를 Intent로 전달 할 때...

BlueBright 2018. 11. 13. 09:51

폰 내부에 있는 영상을 앱에서 View 띄우기 위해서 Uri를 이용했다.

 

임시로 Download 폴더에 넣음

→ Download 까지 절대경로를 이용하여 파일 객체를 만듬

new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS), 비디오 파일 경로)

→ 파일로 부터 URI를 구함

Uri.fromFile(파일 객체)

→ URI를 이용하여 영상을 띄움 

(VideoView 또는 다른 라이브러리 이용)

→ Fragment 에서 Activity로 URI를 Intent에 담아서 전송 

(startActivity(Intent))

→ Activity에서 받은 URI를 활용

intent.getParcelable(키 값)

 

 

문제는 Fragment에서는 비디오가 정상적으로 재생이 되는데

Activity에서는 실행이 되지 않는 문제점 발생 (재생할 수 없는 동영상입니다.)

비디오 라이브러리를 다른 것으로 바꾸어도 결과는 바뀌지 않았고,

디버그를 해도 URI 값은 정상적으로 들어오는 것을 확인

 

 

그러다가 stackoverflow에서 답변의 댓글을 확인하게 되었다.

 

https://stackoverflow.com/a/13981436/7017299

 

For future reference, if you're putting several extras in a Bundle object before using intent.putExtras(bundle);, use bundle.putParcelable("imageUri", uri); instead of using intent.putExtra(...); directly in the Intent object.

 

 

그래서 Intent에 직접 넣지 않고,

Bundle에다가 Uri를 담고, Bundle을 Intent에다가 담아서 다시 시도하니

Activity에서 비디오가 재생되는 것을 확인 했다.

Bundle이 상태 값을 저장하는 목적을 가지고 사용하는 객체라고 하지만,

Bundle하나에 결과가 달라지는지 참...

 

 

예전 블로그에서도 적은 거지만...


* Bundle은 상태/값 등을 저장하기 위한 객체이고,
* Intent는 저장이 아닌 전달하는 수단으로의 객체
즉 포장이사를 하면 박스(Bundle)에 물건을 담고, 트럭(Intent)에 싣고 옮기는 것이라 생각하면 된다.

Intent, Bundle, Parcelable 이 3가지는 모두 Parcelable 을 inherited 한 것이므로
근본적으로는 3가지 모두 공통된 기능을 수행할 수 있다.