시스템이나 다른 앱이 방송하는 메시지를 받는 리시버
시스템 이벤트시 방송
사용 방법
BroadcastReceiver 상속한 클래스, onReceive() 재정의ContextCompat.registerReceiver()로 1번의 클래스 객체 등록IntentFilter로 정의하여 포함ContextCompat.RECEIVER_EXPORTED 플래그 설정unregisterReceiver() 호출onReceive() 재정의class MyBroadcastReceiver(private val onReceiveMessage:
(String, String) -> Unit) : BroadcastReceiver() {
override fun onReceive(context: Context?, intent: Intent?) { ... }
}
private fun startBroadcastReceiver() {
IntentFilter().also {
it.addAction(Intent.ACTION_POWER_CONNECTED)
it.addAction(Intent.ACTION_AIRPLANE_MODE_CHANGED)
it.addAction(Telephony.Sms.Intents.SMS_RECEIVED_ACTION) // 권한 필요
ContextCompat.registerReceiver(this, broadcastReceiver, it, ContextCompat.RECEIVER_EXPORTED)
}
}
override fun onStart() {
super.onStart()
startBroadcastReceiver()
}
override fun onStop() {
super.onStop()
unregisterReceiver(broadcastReceiver)
}
Telephony.Sms.Intents.SMS_RECEIVED_ACTION에 필요한 권한
AndroidManifest.xml에 권한 표시
<uses-feature android:name=
"android.hardware.telephony" android:required="false" />
<uses-permission android:name="android.permission.RECEIVE_SMS" />
동적 권한 요청
rememberLauncherForActivityResult(
contract = ActivityResultContracts.RequestPermission(),
onResult = 결과 받을 람다
).launch(요청할 권한)
rememberLauncherForActivityResult(
contract = ActivityResultContracts.RequestMultiplePermission(),
onResult = 결과 받을 람다
).launch(요청할 권한들의 배열)

Create, Retrieve, Update, Delete 기능 제공CallLog:READ_CALL_LOGcursor = context.contentResolver.query(
android.net.Uri.uri, // Content URI, ex) CallLog.Calls.CONTENT_URI,
String[] projection, // 가져올 테이블의 칼럼 이름
String selection, // 조건, SQL의 WHERE 절과 유사
String[] selectionArgs, // selection의 ?에 들어갈 인자
String sortOrder // SQL의 ORDER BY에 해당
)
cursor.moveToNext()
cursor.getColumnIndex(.getString or .getLong) // 칼럼 인덱스
private fun hasPermission(perm: String) =
context.checkSelfPermission(perm) == PackageManager.PERMISSION_GRANTED
<uses-permission android:name="android.permission.READ_CALL_LOG" />
<uses-permission
android:name="android.permission.READ_EXTERNAL_STORAGE"
android:maxSdkVersion="32" />
<uses-permission android:name="android.permission.READ_MEDIA_IMAGES" />
<uses-permission android:name=
"android.permission.READ_MEDIA_VISUAL_USER_SELECTED" />
READ_CONTACTS<uses-permission android:name="android.permission.READ_CONTACTS" />
permissions += Manifest.permission.READ_CONTACTS