삼성폰(갤럭시S3/S5)에서 MMS 데이터 중 텍스트/이미지는 잘 읽어지는데, 동영상/주소록은 접근권한(canRead)이 없다고 나오는 문제
조회수 1758회
삼성폰(갤럭시S3/S5)에서 MMS 데이터 중 텍스트/이미지는 잘 읽어지는데, 동영상/주소록은 접근권한(canRead)이 없다고 나오는 문제
MMS 데이터 가져오는 코딩 중에 문제가 생겨서 질문 드립니다.
텍스트/이미지는 얻어진 경로에서 잘 읽어지는데, 동영상/주소록은 접근권한(canRead)이 없어서 결국 FileNouTound로 나옵니다.
엘지폰(G2)에서는 동영상/주소록까지 잘 읽어집니다.
코드
Uri uriPart = Uri.parse("content://mms/part"); Cursor cursorPart = contentResolver.query(uriPart, null, selectionPart, null, null); if ("video/mp4".equals(type)) { String videoPath = cursorPart.getString(cursorPart.getColumnIndex("_data")); else if ("text/x-vCard".equals(type)) { String vcfPath = cursorPart.getString(cursorPart.getColumnIndex("_data"));
리턴된 videoPath(예): /data/data/com.android.providers.telephony/app_parts/PART_1491180844718_FILE000.mp4
- 문제
위와 같이 part 테이블을 읽어서 비디오/주소록 파일의 경로를 얻어 왔습니다.
그런데 그 경로를 넘겨서 비디오를 재생하고 주소록 내용을 읽으면 엘지폰(G2)에서는 잘 되는데 ...
삼성폰(갤럭시S3/S5)에서는 파일 접근권한이 없는 것으로 나옵니다.
- 검토 과정
구글링, 질문 - 지칠 정도로 해 보았습니다.
기본 메시지 앱으로 만들면 파일 접근권한을 줄까 싶어서 아래 그림과 같이 <기본 애플리케이션/메시지> 리스트에 나타나게까지 만들어 보았습니다.
DefaultSMS 프로젝트, Default Message App(기본 SMS 앱) (1)/[Android] http://blog.daum.net/andro_java/1135
물론 기본 앱으로 선택까지 해 보았으나, 여전히 접근권한이 없다고 나옵니다.
다른 메시지 앱을 보면 기본 앱으로 지정하지 않아도 잘 읽던데 ... 답답합니다.
- 질문
이 문제를 해결할 수 있는 어떤 방법이 있는지 도와 주시기 바랍니다.
-
(•́ ✖ •̀)
알 수 없는 사용자
1 답변
-
MMS의 미디어를 가져오는 작업을 해본적이 없어서 직접적인 도움이 될지는 모르겠습니다만 파일의 절대 경로가 아닌 Content Uri를 이용해서 동영상을 재생해야 하지 않을까 싶습니다. 예를 들면 A라는 앱의 이미지/동영상의 내부 경로(Internal storage)를 알아냈다고 해서 그 경로를 이용해 앱의 콘텐츠를 재생하는 것은 보안상 불가능 한게 맞고요.
ContentProvider를 통해 제공되는 모든 데이터는 Content Uri로 접근이 가능하기 때문에 이 정보만을 이용해야 하지 않을까 싶습니다. 따라서 올려주신 코드에서 파일의 절대 경로를 얻어오는 것이 아닌
getContentResolver().openInputStream(uri)
을 이용해 스트림을 얻어오는 방식으로 테스트 해보시기 바랍니다.좀 더 상세한 코드는 다음 링크를 참고하세요.
추가로 기본 메시지 앱으로 지정하는 것은 예를 들어서 제 데스크 탑에 크롬과, 사파리가 설치되어 있는 경우, 어떤 브라우저를 기본 브라우저로 실행할 것인지를 설정하는 것입니다. 따라서 권한이 추가로 부여되는 것은 아닙니다.
-
(•́ ✖ •̀)
알 수 없는 사용자
-
답변 감사합니다.
파일의 절대 경로를 얻어오는 것이 아닌 getContentResolver().openInputStream(uri)을 이용해 스트림을 얻어오는 방식
이것도 이미 구글링하던 과정에 나름대로 테스트해 보았는데 마찬가지 결과(접근권한(canRead)이 없어서 결국 FileNouTound)를 얻었습니다.
리턴된 videoPath(예): /data/data/com.android.providers.telephony/app_parts/PART_1491180844718_FILE000.mp4
이것을 (1) 변수에 저장했다가 나중에 openInputStream으로 읽는 방법 (2) 수집하는 동시(커서가 열린 상태) openInputStream으로 읽는 방법 모두 실패했습니다.
if ("video/mp4".equals(type)) {
String videoPath = cursorPart.getString(cursorPart.getColumnIndex("_data"));
else if ("text/x-vCard".equals(type)) {
String vcfPath = cursorPart.getString(cursorPart.getColumnIndex("_data"));
선생님 생각에 위 코드를 어떻게 수정하면 될 것이라는 말씀인지, 제가 이해를 잘 못하고 있다면 가르쳐 주세요.
다시 질문하고픈 답변을 주시는 분조차 찾기 힘들어 선생님께 다시 매달립니다.
부탁 드립니다.
감사합니다. 알 수 없는 사용자 2017.4.21 06:24
-
댓글 입력