본문 바로가기
android

안드로이드기능/실습–19 CONTENT PROVIDER- AUDIO

by 뱅뱅뱅뱅뱅 2024. 12. 6.

컨텐트 프로바이더

  • 데이터를 다른 애플리케이션에 공유하기 위한 모듈
  • 모든 패키지들이 데이터를 공유하기 위해서는 사용해야 함
  • 직접 개발해서 이용하는 커스텀 컨텐트 프로바이더 존재

종류

  • CallLog: 통화 기록
  • Contacts: 연락처
  • Browser: 북마크, 히스토리
  • MediaStore: 외부 매체에 저장된 오디오, 비디오...
  • UserDictionary: 사용자 정의 단어 사전


    컨텐트 프로바이더에 접근할 때, 컨텐트 리졸버가 필요함

ContentResolver는 안드로이드 애플리케이션에서 콘텐츠 URI를 통해 데이터를 읽거나 쓸 때 사용

주요 URI와 ContentResolver의 역할

 

URI: 특정 데이터에 접근

  • CallLog.Calls.CONTENT_URI (통화 기록)
    사용자의 통화 기록 데이터를 가져온다.
  • ContactsContract.Contacts.CONTENT_URI (연락처 목록)
    사용자의 연락처 데이터를 제공
  • MediaStore 관련 URI
    • MediaStore.Images.Media.INTERNAL_CONTENT_URI
      내장 저장소에 있는 이미지 데이터에 액세스.
    • MediaStore.Images.Media.EXTERNAL_CONTENT_URI
      외장 저장소에 있는 이미지 데이터에 액세스.
    • MediaStore.Video.Media.INTERNAL_CONTENT_URI
      내장 저장소에 있는 비디오 데이터에 액세스.
    • MediaStore.Video.Media.EXTERNAL_CONTENT_URI
      외장 저장소에 있는 비디오 데이터에 액세스.
    • MediaStore.Audio.Media.INTERNAL_CONTENT_URI
      내장 저장소에 있는 오디오 데이터에 액세스.
    • MediaStore.Audio.Media.EXTERNAL_CONTENT_URI
      외장 저장소에 있는 오디오 데이터에 액세스.

 

ContentResolver

Content Provider와 통신하기 위해 제공되는 클래스

 

데이터 읽기

Cursor cursor = getContentResolver().query(ContactsContract.Contacts.CONTENT_URI, null, null, null, null);

 

(URI, 조회할 컬럼, 선택할 줄, 선택 조건, 정렬 조건)

 

레이아웃

 

ScrollView 의 자식 -> TextView

 


LinearLayout?

  • 스크롤 뷰는 반드시 하나의 자식만 가질 수 있다.
  • 여러 개의 View를 넣으려면 하나의 ViewGroup 사용
  • LinearLayout은 여러 자식 View를 수직/수평으로 정렬하는 데 적합한 ViewGroup

 

fillViewport

  • 기본 상태:
    • 자식 View의 크기만큼만 ScrollView가 공간을 차지합니다.
    • 자식 View가 작으면 화면 아래쪽에 빈 공간이 생길 수 있습니다.
  • fillViewport="true" 상태:
    • ScrollView가 자식 View를 화면 크기만큼 늘려서 빈 공간 없이 화면을 꽉 채웁니다.

 

 

 

 

AndroidManifest.xml

 

다른 소스에서 참조할 때 Manifest.permission

 

 

코드 분석

 

ActivityCompat.requestPermissions

사용자에게 권한 허용/거부 대화 상자를 표시

 

if (ActivityCompat.checkSelfPermission(this, Manifest.permission.READ_CALL_LOG) != PackageManager.PERMISSION_GRANTED) {
    // 권한이 허용되지 않은 경우 실행되는 코드
}

 

Manifest.permission.WRITE_EXTERNAL_STORAGE

앱이 사용자의 외부 저장소(External Storage)에 데이터를 쓰기(Write) 위한 권한입니다. 이를 요청하는 이유는 앱이 저장소에 파일(예: 사진, 문서, 로그 파일 등)을 저장하려는 경우 사용자에게 이를 명시적으로 허락받기 위함

 

WRITE_EXTERNAL_STORAGE 권한이 필요한 이유

  1. 파일 생성 및 수정
    앱이 외부 저장소에 새 파일을 저장하거나, 기존 파일을 수정하려면 이 권한이 필요합니다.
    예:
    • 사진 편집 앱이 갤러리에 새 이미지를 저장할 때.
    • 문서 앱이 Downloads 폴더에 파일을 저장할 때.
  2. 다른 앱과 데이터 공유
    외부 저장소에 저장된 데이터는 다른 앱에서도 접근 가능합니다.
    예:
    • 음악 앱이 외부 저장소에서 음악 파일을 읽거나 쓸 때.
    • 다운로드 앱이 파일을 저장하는 경우.

 

 

Android 파일 접근 모드

  1. MODE_PRIVATE
    • 파일이 현재 앱만 접근 가능.
    • 기존 파일이 있으면 덮어씀.
  2. MODE_APPEND
    • 기존 파일이 있으면 내용 끝에 추가.
  3. MODE_WORLD_READABLE (Deprecated)
    • 모든 앱이 읽기 가능 (Android 4.2 이후 사용 중단).
  4. MODE_WORLD_WRITEABLE (Deprecated)
    • 모든 앱이 읽고 쓰기 가능 (Android 4.2 이후 사용 중단).
  5. MODE_NO_LOCALIZED_COLLATORS
    • 파일 이름 비교 시 지역화된 문자열 비교 비활성화.

 

권한 요청에 배열을 사용하는 이유

  • Android에서는 앱이 필요로 하는 권한이 여러 개일 수 있습니다.
    • 예: 카메라, 위치, 저장소 접근 등.
  • 한 번의 호출로 여러 권한을 동시에 요청할 수 있도록 배열 형태를 사용합니다.
  • 권한 요청이 여러 개라도, 사용자에게는 하나의 팝업으로 표시됩니다.

 

 

 

외장 저장소에 있는 오디오 데이터에 액세스.

 

 

 

 

 


안드로이드 기능/실습 – 20 CONTENT PROVIDER - 통화

 

 

 

 

  • 반환값:
    • PackageManager.PERMISSION_GRANTED: 권한이 허용된 상태.
    • PackageManager.PERMISSION_DENIED: 권한이 거부된 상태.

 

 

 

 

 

 

 

 

 


컨텐트 프로바이더와 종류

MediaStore.Audio.Media.INTERNAL_CONTENT_URI
MediaStore.Video.Media.EXTERNAL_CONTENT_URI
MediaStore.Images.Media.INTERNAL_CONTENT_URI

fillViewport

LinearLayout

ActivityCompat.requestPermissions

Manifest.permission.WRITE_EXTERNAL_STORAGE


ContentResolver cr = getContentResolver();
Cursor c = cr.query(MediaStore.Audio.Media.INTERNAL_CONTENT_URI , null, null, null, MediaStore.Audio.Media.TITLE + " ASC");

requestPermissions( 1, 2, 3 )