삼성폰(갤럭시S3/S5)에서 MMS 데이터 중 텍스트/이미지는 잘 읽어지는데, 동영상/주소록은 접근권한(canRead)이 없다고 나오는 문제

조회수 1751회

삼성폰(갤럭시S3/S5)에서 MMS 데이터 중 텍스트/이미지는 잘 읽어지는데, 동영상/주소록은 접근권한(canRead)이 없다고 나오는 문제

MMS 데이터 가져오는 코딩 중에 문제가 생겨서 질문 드립니다.

텍스트/이미지는 얻어진 경로에서 잘 읽어지는데, 동영상/주소록은 접근권한(canRead)이 없어서 결국 FileNouTound로 나옵니다.

엘지폰(G2)에서는 동영상/주소록까지 잘 읽어집니다.

  1. 코드

    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

  1. 문제

위와 같이 part 테이블을 읽어서 비디오/주소록 파일의 경로를 얻어 왔습니다.

그런데 그 경로를 넘겨서 비디오를 재생하고 주소록 내용을 읽으면 엘지폰(G2)에서는 잘 되는데 ...

삼성폰(갤럭시S3/S5)에서는 파일 접근권한이 없는 것으로 나옵니다.

  1. 검토 과정

구글링, 질문 - 지칠 정도로 해 보았습니다.

기본 메시지 앱으로 만들면 파일 접근권한을 줄까 싶어서 아래 그림과 같이 <기본 애플리케이션/메시지> 리스트에 나타나게까지 만들어 보았습니다.

DefaultSMS 프로젝트, Default Message App(기본 SMS 앱) (1)/[Android] http://blog.daum.net/andro_java/1135

물론 기본 앱으로 선택까지 해 보았으나, 여전히 접근권한이 없다고 나옵니다.

다른 메시지 앱을 보면 기본 앱으로 지정하지 않아도 잘 읽던데 ... 답답합니다.

  1. 질문

이 문제를 해결할 수 있는 어떤 방법이 있는지 도와 주시기 바랍니다.

  • (•́ ✖ •̀)
    알 수 없는 사용자

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

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)