이 글은 『Do it! 깡샘의 안드로이드 앱 프로그래밍 with 코틀린』교재를 바탕으로 작성되었습니다.
package com.example.ch14_receiver
import android.content.Intent
import android.content.IntentFilter
import android.content.pm.PackageManager
import android.graphics.BitmapFactory
import android.os.BatteryManager
import android.os.Bundle
import android.widget.Toast
import androidx.activity.result.contract.ActivityResultContracts
import androidx.appcompat.app.AppCompatActivity
import androidx.core.content.ContextCompat
import com.example.ch14_receiver.databinding.ActivityMainBinding
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
val binding = ActivityMainBinding.inflate(layoutInflater)
setContentView(binding.root)
//add......................
val permissionLauncher = registerForActivityResult(
ActivityResultContracts.RequestMultiplePermissions()
) {
if (it.all { permission -> permission.value == true }) {
val intent = Intent(this, MyReceiver::class.java)
sendBroadcast(intent)
} else {
Toast.makeText(this, "permission denied...", Toast.LENGTH_SHORT).show()
}
}
registerReceiver(null, IntentFilter(Intent.ACTION_BATTERY_CHANGED))!!.apply {
when(getIntExtra(BatteryManager.EXTRA_STATUS, -1)){
BatteryManager.BATTERY_STATUS_CHARGING -> {
when(getIntExtra(BatteryManager.EXTRA_PLUGGED, -1)){
BatteryManager.BATTERY_PLUGGED_USB -> {
binding.chargingResultView.text = "USB Plugged"
binding.chargingImageView.setImageBitmap(BitmapFactory.decodeResource(
resources, R.drawable.usb
))
}
BatteryManager.BATTERY_PLUGGED_AC -> {
binding.chargingResultView.text = "AC Plugged"
binding.chargingImageView.setImageBitmap(BitmapFactory.decodeResource(
resources, R.drawable.ac
))
}
}
}
else -> {
binding.chargingResultView.text = "Not Plugged"
}
}
val level = getIntExtra(BatteryManager.EXTRA_LEVEL, -1)
val scale = getIntExtra(BatteryManager.EXTRA_SCALE, -1)
val batteryPct = level / scale.toFloat() * 100
binding.percentResultView.text = "$batteryPct %"
}
binding.button.setOnClickListener {
if (ContextCompat.checkSelfPermission(
this,
"android.permission.POST_NOTIFICATIONS"
) == PackageManager.PERMISSION_GRANTED ) {
val intent = Intent(this, MyReceiver::class.java)
sendBroadcast(intent)
} else {
permissionLauncher.launch(
arrayOf(
"android.permission.POST_NOTIFICATIONS"
)
)
}
}
}
}
package com.example.ch14_receiver
import android.app.NotificationChannel
import android.app.NotificationManager
import android.content.BroadcastReceiver
import android.content.Context
import android.content.Intent
import android.media.AudioAttributes
import android.media.RingtoneManager
import android.net.Uri
import android.os.Build
import android.util.Log
import androidx.appcompat.app.AppCompatActivity
import androidx.core.app.NotificationCompat
class MyReceiver : BroadcastReceiver() {
override fun onReceive(context: Context, intent: Intent) {
Log.d("kkang","MyReceiver...............")
val manager = context.getSystemService(AppCompatActivity.NOTIFICATION_SERVICE) as NotificationManager
val builder: NotificationCompat.Builder
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
//26버전 이상
val channelId = "one-channel"
val channelName = "My Channel One"
val channel = NotificationChannel(
channelId,
channelName,
NotificationManager.IMPORTANCE_DEFAULT
).apply {
//채널에 다양한 정보 설정
description = "My Channel One Description"
setShowBadge(true)
val uri: Uri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION)
val audioAttributes = AudioAttributes.Builder()
.setContentType(AudioAttributes.CONTENT_TYPE_SONIFICATION)
.setUsage(AudioAttributes.USAGE_ALARM)
.build()
setSound(uri, audioAttributes)
enableVibration(true)
}
//채널을 NotificationManager에 등록
manager.createNotificationChannel(channel)
//채널을 이용하여 builder 생성
builder = NotificationCompat.Builder(context, channelId)
} else {
//26버전 이하
builder = NotificationCompat.Builder(context)
}
builder.run {
//알림의 기본 정보
setSmallIcon(android.R.drawable.ic_notification_overlay)
setWhen(System.currentTimeMillis())
setContentTitle("홍길동")
setContentText("안녕하세요")
}
manager.notify(11, builder.build())
}
}