컨텐트 프로바이더
- 데이터를 다른 애플리케이션에 공유하기 위한 모듈
- 모든 패키지들이 데이터를 공유하기 위해서는 사용해야 함
- 직접 개발해서 이용하는 커스텀 컨텐트 프로바이더 존재
종류
- 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
외장 저장소에 있는 오디오 데이터에 액세스.
- MediaStore.Images.Media.INTERNAL_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 권한이 필요한 이유
- 파일 생성 및 수정
앱이 외부 저장소에 새 파일을 저장하거나, 기존 파일을 수정하려면 이 권한이 필요합니다.
예:- 사진 편집 앱이 갤러리에 새 이미지를 저장할 때.
- 문서 앱이 Downloads 폴더에 파일을 저장할 때.
- 다른 앱과 데이터 공유
외부 저장소에 저장된 데이터는 다른 앱에서도 접근 가능합니다.
예:- 음악 앱이 외부 저장소에서 음악 파일을 읽거나 쓸 때.
- 다운로드 앱이 파일을 저장하는 경우.
Android 파일 접근 모드
- MODE_PRIVATE
- 파일이 현재 앱만 접근 가능.
- 기존 파일이 있으면 덮어씀.
- MODE_APPEND
- 기존 파일이 있으면 내용 끝에 추가.
- MODE_WORLD_READABLE (Deprecated)
- 모든 앱이 읽기 가능 (Android 4.2 이후 사용 중단).
- MODE_WORLD_WRITEABLE (Deprecated)
- 모든 앱이 읽고 쓰기 가능 (Android 4.2 이후 사용 중단).
- 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 )
'android' 카테고리의 다른 글
안드로이드 기능/실습 – 21- BROADCAST RECEIVER (0) | 2024.12.08 |
---|---|
8장 기능/실습 - 15 ( GridView ) (1) | 2024.10.10 |
7장 기능/실습 - 14 ( Spinner ) (0) | 2024.10.08 |
7장 기능/실습 - 13 ( ListView ) (4) | 2024.10.08 |