1. ContentProvider
2. ContentProvider 사용 방법(A App)
1) ContentProvider를 상속받아 Content Provider 클래스 작성
class MyContentProvider: ContentProvider() {
override fun delete(uri: Uri, selection: String?, selectionArgs: Array<out String>?): Int { }
override fun getType(uri: Uri): String? { }
override fun insert(uri: Uri, values: ContentValues?): Uri? { }
override fun onCreate(): Boolean { }
override fun query(
uri: Uri, projection: Array<out String>?, selection: String?,
selectionArgs: Array<out String>?, sortOrder: String?
): Cursor? { }
override fun update(
uri: Uri, values: ContentValues?, selection: String?,
selectionArgs: Array<out String>?
): Int { }
}
2) AndroidManifest.xml 파일에 Content Provider 등록
<provider
android:name=".MyContentProvider"
android:authorities="com.example.provider"
android:enabled="true"
android:exported="true"></provider>
3. ContentProvider 사용 방법(B App)
1) Query Visibility 관련 설정
<queries>
<!-- 둘 중 하나만 선언되어 있으면 된다-->
<!-- <provider android:authorities="com.example.test.provider" /> -->
<package android:name="com.example.test_outer" />
</queries>
2) ContentResolver 객체 이용
contentResolver.query(
Uri.parse("content://com.example.test.provider"),
null, null, null, null)
content://com.example.test.provider
// content → scheme
// com.example.test.provider → host
1. Contacts App
<uses-permission android:name="android.permission.READ_CONTACTS"/>
1) 주소록 목록 화면을 띄우기
val intent = Intent(Intent.ACTION_PICK, ContactsContract.CommonDateKinds.Phone.CONTENT_URI)
requestActivity.launch(intent)
2) 유저가 선택한 사람의 전화번호 혹은 이메일 정보를 획득
val cursor = contentResolver.query(
it.data!!.data!!,
arrayOf<String>(ContactsContract.CommonDateKinds.Phone.DISPLAY_NAME, ContactsContract.CommonDateKinds.Phone.NUMBER),
null,
null,
null
)
1. Gallery App
1) 인텐트로 갤러리앱의 이미지 목록 화면을 출력
val intent = Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI)
intent.type = "image/*"
requestActivity.launch(intent)
2) OOM 문제(Out Of Memory Exception) 해결
// 5로 지정시 5분의 1로 줄여서 로딩
val option = BitmapFactory.Options()
option.inSampleSize=5
3) 유저가 선택한 이미지 정보를 획득
var inputStream = contentResolver.openInputStream(it.data!!.data!!)
val bitmap = BitmapFactory.decodeStream(inputStream, null, option)
1. Call App
1) 퍼미션 필요
<uses-permission android:name="android.permission.CALL_PHONE"/>
2) 퍼미션 허용시
val intent = Intent(Intent.ACTION_CALL, Uri.parse("tel:${editView.text}"))
startActivity(intent)
1. Camera App
1) 사진 데이터 획득 방법
val intent = Intent(MediaStore.ACTION_IMAGE_CAPTURE_
requestActivity.launch(intent)
val bitmap = it.data?.getExtras()?.get("data") as Bitmap
2) 파일 공유 방법
① 애플리케이션간 파일 공유를 위해 xml 파일 준비
<paths xmlns:android="http://schemas.android.com/apk/res/android">
<external-path
name="myfiles"
path="Android/data/com.example.ex1851/files/Pictures"/>
</paths>
<provider
android:authorities="com.example.ex1851.fileprovider"
android:name="androidx.core.content.FileProvider"
android:exported="false"
android:grantUriPermissions="true">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/file_path"></meta-data>
</provider>
② 앱에서 사진을 저장할 파일을 만든다
val file = File.createTempFile(
"JPEG_${timeStamp}_",
".jpg",
storageDir
)
filePath = file.absolutePath
③ 파일 정보를 포함해서 인텐트를 발생시켜 카메라 앱을 실행시킨다
val uri = FileProvider.getUriForFile(
this,
"com.example.ex1851.fileprovider",
file
)
val intent = Intent(MediaStore.ACTION_IMAGE_CAPTURE)
intent.putExtra(MediaStore.EXTRA_OUTPUT, uri)
fileLauncher.launch(intent)
④ 카메라 앱에서 사진 촬영 후 촬영된 사진을 공유된 파일에 저장한다
⑤ 카메라 앱이 종료되면서 성공/실패를 반환하다
⑥ 앱에서 파일을 읽어 카메라 앱이 저장한 사진 데이터를 이용한다
val bitmap = BitmapFactory.decodeFile(filePath, option)
콘텐츠 프로바이더 말고 콘치즈 프로바이더는 없나요?