김호쭈
DevForYou
김호쭈
전체 방문자
오늘
어제
  • 분류 전체보기 (321)
    • • 데이터베이스(DB) (9)
      • __SQL__ (9)
    • •알고리즘(Algorithm ) (117)
      • 문제풀이 (99)
      • 스터디 (14)
      • 알고리즘 팁 (4)
    • •Compter Science (57)
      • Operating System (25)
      • Computer Network (1)
      • Computer Vision (16)
      • Artificial Intelligence (14)
      • Software Technology (1)
    • • 독서 (36)
      • Design Pattern (24)
      • 객체지향의 사실과 오해 (1)
      • Object Oriented Software En.. (11)
    • • 개발 (26)
      • React (3)
      • node.js (6)
      • Django (11)
      • Spring boot (6)
    • • 개발Tip (4)
      • GitHub (0)
    • •프로젝트 (2)
      • 물물 (2)
    • •App (54)
      • 안드로이드 with Kotlin (50)
      • 코틀린(Kotiln) (4)
    • •회고 (8)
    • •취준일기 (3)
    • • 기타 (2)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • local저장소
  • 로컬저장소
  • 원격저장소
  • Remote저장소
  • GitHubDesktop
  • ㄱ
  • KMU_WINK
  • 깃허브데스크탑

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
김호쭈

DevForYou

[에러/안드로이드] 액티비티간 주고받은 uri 권한 연장하기, Permission Denial: opening provider com.android.providers.media.MediaDocumentProvider
•App/안드로이드 with Kotlin

[에러/안드로이드] 액티비티간 주고받은 uri 권한 연장하기, Permission Denial: opening provider com.android.providers.media.MediaDocumentProvider

2022. 5. 25. 01:55

# 시작하며

 학교에서 진행하는 프로젝트에서 필요한 메인기능에 디자인을 입히기전 간단한 프로토 타입을 만들었다.

 

# 원인 분석

  1. A액티비티 : 리사이클러뷰에서 사진 선택
  2. 새로운 액티비티(B)가 열림( 진짜 구현해야할 앱에서는 여기서 추가적인 기능이 수행 됨)
  3. B액티비티에서 SAF을 이용해서 갤러리 접근 및 사진 uri를 가져옴 
  4. B액티비티에서 이미지 uri가 잘 가져왔는지 이미지 뷰에 set시켜 확인
  5. A액티비티의 각각의 리사이클러뷰까지 이미지가 잘 넘어와짐
  6. A액티비티에서 저장하기를 누르면 파이어베이스 스토리지에 이미지가 저장되고 저장된 이미지 리소스 URL값을 가져와야함 but ERROR

 

# 에러 발생

이미지 저장을 누르는 시점에서

위와 같은 에러가 발생한다.  

Permission Denial: opening provider com.android.providers.media.MediaDocumentProvider 
requires that you obtain access using ACTION_OPEN_DOCUMENT or related APIs

정말 구글이랑 스택오버플로우 다 뒤져봤다... 일단 거기서 한계점을 맡고 왜 오류가 나는지에 대해서 알아봐야할것 같았다.  

먼저 권한오류이기때문에 내가 권한을 줬는지 체크해봤다. 권한은 다 잘 줬다.

 

# 에러찾기

 

TIL:SAF URI 권한 유지 · lsm

Written by LSM on April 08, 2020 TIL:SAF URI 권한 유지 SAF URI 권한 유지 ACTION_OPEN_DOCUMENT 인텐트를 통해서 받은 uri를 다른 Activity에서 다시 사용하려 하니 다음과 같은 에러를 받았다. Permission Denial: opening pr

songmilee.github.io

위 글을 참고했다. 일단 uri자체가 계속해서 존재하는 그러한 건 아니라는 말이다. 권한이 생각보다 짧기때문에 그 권한을 늘려줘야 한다는 말인듯 싶었다. 

저기 적혀있는 해결책은 일단 안됐다. 그래도 왜 일어나는지 알았다. 

 

# 해결

 그렇다면 권한을 늘려줘야한다. 첫번째로는 SAF로 갤러리에서 uri를 받아올때 권한을 늘려줄 것인가 ? 두번째로는 B->A액티비티로 넘겨줄때 권한을 늘려줄것인가이다. 첫번째로 해봤을때는 안됐다. 그래서 두번째방식을 도전해보기로 했다. 

 

Grant Uri permission to another activity

I'm trying to get image from device gallery and then show it in another activity. Code in my activity: private void startGallery() { Intent intent = new Intent(Intent.ACTION_GET_CONTENT); ...

stackoverflow.com

 

startActivity(new Intent(this, Something.class).setData(uri).addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION));

  원래는 인탠트간 uri를 넘겨줄때 putExtra를 이용하거나 getParcelableExtra을 사용했는데, 위 스택오버플로우에서 위와 같은 방법으로 addFlag로 FLAG_GRANT_READ_URI_PERMISSION로 주라고 했다. 그래서 코드를 조금 수정했다. 

>> 보낼때

            val intent = Intent(this, MainActivity::class.java).apply {
                data = selectedImageURI
                addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION)
                putExtra(MainActivity.STRING_INTENT_ITEM_FROM_RECOMMEND_KEY, itemName)
            }
            setResult(Activity.RESULT_OK, intent)
            if (!isFinishing) finish()

data에다가 uri를 담아 보내주고 거기에 addFlag해줘서 권한 연장을 해줬다. 

 

>> 받을때

            registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result ->
                if (result.resultCode == Activity.RESULT_OK) {
                    val uri = result.data?.data
                    val itemName = result.data?.getStringExtra(STRING_INTENT_ITEM_FROM_RECOMMEND_KEY)
                    if (uri == null) {
                        Log.d(TAG, "uri값을 가져오지 못했습니다")
                        return@registerForActivityResult
                    }

 

>> SAF로 이미지 열때

    private fun getImageFromGallery() {
        Toast.makeText(this, " 갤러리로 이동합니다!!", Toast.LENGTH_SHORT).show()
        val intent = Intent(Intent.ACTION_OPEN_DOCUMENT) // 이걸 ACTION_GET_CONTENT에서 바꿔줌
        intent.type = "image/*"
        startActivityForResult(intent, 2000)
    }

 

# 결론

uri에는 권한이 존재하지만 그건 일시적임.

늘려줘야함.

보낼때 늘려주자

 

 

 

 

저작자표시 (새창열림)

'•App > 안드로이드 with Kotlin' 카테고리의 다른 글

[안드로이드&코틀린] 에어비앤비#2, Mocky로 임시 API 만들기, Glide에서 CenterCrop사용하기, Glide로 corner radius주기 ,dp값 px로 바꾸기  (0) 2022.07.04
[안드로이드&코틀린] 에어비앤비#1, 네이버 mapAPI 사용하기, 코디네이터(CoordinatorLayout)레이아웃, bottomSheet레이아웃 만들기  (0) 2022.07.04
[안드로이드&코틀린] 앨범 만들기#5, 파이어베이스 스토리지 사용하기, 코틀린 콜백함수, 이미지 업로드하기, 이미지 불러오기, 프로그레스 바, 안드로이드 화면 터치 막기  (0) 2022.05.11
[안드로이드&코틀린] 중고거래앱 만들기#4, 파일 접근 권한 얻기, 갤러리에서 이미지 가져오기, floatButton, 파이어베이스 동기 처리  (4) 2022.05.10
[안드로이드&코틀린] 중고거래앱 만들기#3, 프래그먼트에서 파이어베이스 연결하기, 파이어베이스 동기처리  (1) 2022.05.09
    '•App/안드로이드 with Kotlin' 카테고리의 다른 글
    • [안드로이드&코틀린] 에어비앤비#2, Mocky로 임시 API 만들기, Glide에서 CenterCrop사용하기, Glide로 corner radius주기 ,dp값 px로 바꾸기
    • [안드로이드&코틀린] 에어비앤비#1, 네이버 mapAPI 사용하기, 코디네이터(CoordinatorLayout)레이아웃, bottomSheet레이아웃 만들기
    • [안드로이드&코틀린] 앨범 만들기#5, 파이어베이스 스토리지 사용하기, 코틀린 콜백함수, 이미지 업로드하기, 이미지 불러오기, 프로그레스 바, 안드로이드 화면 터치 막기
    • [안드로이드&코틀린] 중고거래앱 만들기#4, 파일 접근 권한 얻기, 갤러리에서 이미지 가져오기, floatButton, 파이어베이스 동기 처리
    김호쭈
    김호쭈
    공부하고 정리하고 기록하기

    티스토리툴바