Privacy Changes in Android Q#1
Privacy Changes in Android Q#1 ๊ด๋ จ
Info
์๋ ํ์ธ์. ๊ฐ๋จ์ธ๋์์ Android ๊ฐ๋ฐ์ ๋งก๊ณ ์๋ David ์ ๋๋ค.
ํด๋น ๊ธ์ ์ ๊ฐ Google I/O 19 Extended in Korea Android ์์ ๋ฐํํ๋ ๋ถ๋ถ์ ์ ๋ฆฌํ ๊ธ์ ๋๋ค.
์๋๋ก์ด๋์์ ์๋ก์ด ๋ฒ์ ์ด ๋์ฌ๋ ๋ง๋ค ๊ฐ์ธ์ ๋ณด๋ฅผ ๋ณดํธํ๊ธฐ ์ํ์ฌ ๋ค์ํ ๊ธฐ๋ฅ์ ์ถ๊ฐํ๊ณ ์์ต๋๋ค
Lockdown Mode, Secure DNS ๊ทธ๋ฆฌ๊ณ ๋ง์๋ฉ๋ก์ฐ ๋ถํฐ ์ถ๊ฐ๋์๋ Runtime permissions ๋ฑ์ด ์์์ต๋๋ค.
Android Q ์์๋ ๊ฐ์ธ์ ๋ณด๋ฅผ ๋ณดํธํ๊ธฐ ์ํ์ฌ ๋ง์ ๊ธฐ๋ฅ์ด ์ถ๊ฐ๋์์ต๋๋ค.
๊ทธ์ค ๊ฐ์ฅ ๋ณํ๊ฐ ํฐ ๋ถ๋ถ์ Location Settings, App Storage, Background App Launching, Device ID Restrictions ์ด ์์ต๋๋ค.
์ด๋ฒ ๊ธ์์ ๋ค๋ค๋ณผ ๋ด์ฉ์ ๋ฐฑ๊ทธ๋ผ์ด๋ ์ฑ์ ๋ํ ์๋ก์ด ์ ํ์ฌํญ ์ ๋๋ค.
Android Q Beta4 ์์ ๋ช๊ฐ์ง ๋ณ๊ฒฝ์ฌํญ์ด ์์ต๋๋ค.
- ์ฌ์ฉ์ ์ํธ์์ฉ ์์ด ๋ฐฑ๊ทธ๋ผ์ด๋์์ ์กํฐ๋นํฐ๋ฅผ ์คํ์ํฌ ์ ์์
- ๋ฐฑ๊ทธ๋ผ์ด๋์์ ์กํฐ๋นํฐ๋ฅผ ์คํ์ํฌ ๋๋ notification์ ํ์ฉํด์ผํจ
- ๊ฐ๋ฐ์ ์ต์ ์์ Allow background activity starts ๊ธฐ๋ฅ์ ๊บผ์ผ์ง ๋ฐฑ๊ทธ๋ผ์ด๋ ์ ํ์ฌํญ์ ์คํ์ํฌ ์ ์์ (์ ์ release ๋ฒ์ ์์๋ on/off ์๊ด์์ด ๋ฐฑ๊ทธ๋ผ์ด๋ ์ ํ์ฌํญ์ด ์ ์ฉ๋จ)
Android Q Beta์์ ๋ฐฑ๊ทธ๋ผ์ด๋ ์ ํ์ฌํญ์ ์คํ์ํค๊ณ ์ถ์ผ๋ฉด
๊ฐ๋ฐ์ ์ต์ ์์ ์ฑ ์นดํ ๊ณ ๋ฆฌ์ ์๋ ๋ฐฑ๊ทธ๋ผ์ด๋ ํ๋ ์์ ํ์ฉ ๊ธฐ๋ฅ์ off ํ๋ฉด ์ ์ฉ๋ฉ๋๋ค.
Android Q ์ด์ ์๋ ์ฌ์ฉ์ ์ํธ์์ฉ ์์ด ๋ฐฑ๊ทธ๋ผ์ด๋์์ ์กํฐ๋นํฐ๋ฅผ ์คํ์ํฌ์์์๋๋ฐ
์ด๋ฌํ ๋์์ ์ฌ์ฉ์์๊ฒ ๋ถํธํจ์ ์ผ์ผํค๊ฒ ๋ฉ๋๋ค.
์ฑ์ด ํ์ฌ ๋ฐฑ๊ทธ๋ผ์ด๋ ์ํ์ ์์ต๋๋ค.
์๋ฒ์์ push messsage๋ฅผ ๋ฐ์์ ๊ฒฝ์ฐ ์ฌ์ฉ์ ์ํธ์์ฉ ์์ด
FLAG_ACTIVITY_NEW_TASK
ํ๋๊ทธ๋ฅผ ์ด์ฉํ์ฌ ์กํฐ๋นํฐ๊ฐ ์คํ๋๋ ๋ชจ์ต์ ๋ณผ ์ ์์ต๋๋ค.
override fun onMessageReceived (message: RemoteMessage?) {
goLiveConsIncomingActivity(this)
}
fun goLiveConsIncomingActivity (context: Context) {
val intent = Intent(context, LiveConsIncomingActivity::class.java)
intent.flags = Intent.FLAG_ACTIVITY_NEW_TASK
context.startActivity(intent)
}
์์ค์ฝ๋๋ฅผ ๋ณด๊ฒ ๋๋ฉด push message๊ฐ ์์ ๊ฒฝ์ฐ onMessageReceived
ํจ์๊ฐ ํธ์ถ๋๊ณ
onMessageReceived
ํจ์ ์์์๋ ์กํฐ๋นํฐ๋ฅผ ์คํ์ํค๊ธฐ ์ํ์ฌ FLAG_ACTIVITY_NEW_TASK
๋ฅผ ์ฌ์ฉํ๊ณ ์์ต๋๋ค.
Android Q์์๋ ๋ฐฑ๊ทธ๋ผ์ด๋์์ ์กํฐ๋นํฐ ์คํ์ด ์ ํ๋ฉ๋๋ค.
์ฌ์ฉ์ ์ํธ์์ฉ์์ด ์คํ์ด ๋ถ๊ฐ๋ฅํ๋ฉฐ ์ฑ ํ๊ฒ์ด Android Q๊ฐ ์๋๋๋ผ๋ Android Q ๋๋ฐ์ด์ค์์๋ ์ํฅ์ ๋ฏธ์นฉ๋๋ค.
์ง๊ธ ํ์ฌ ๋ฒ ํ์์๋ ๋ฐฑ๊ทธ๋ผ์ด๋์์ ์กํฐ๋นํฐ๊ฐ ์คํ๋์ง๋ง ํ ์คํธ ๋ฉ์์ง์ ๋ก๊ทธ์ผ์ ๋ํ๋ฉ๋๋ค.
์ถํ ์ ์๋ฒ์ ์์๋ ๋ฐฑ๊ทธ๋ผ์ด๋์์ ์กํฐ๋นํฐ ์คํ์ด ์ ํ๋ฉ๋๋ค.
๊ทธ๋ฌ๋ฉด ์ฑ์ด ๋ฐฑ๊ทธ๋ผ์ด๋ ์ํ์ผ๋ ์ฌ์ฉ์์๊ฒ ์ค์ํ ์ ๋ณด๋ฅผ ์ ๋ฌํ๊ณ ์ถ์๋๋ ์ด๋ป๊ฒ ํด์ผํ ๊น์?
๋ฐฑ๊ทธ๋ผ์ด๋ ์ํ์ผ๋ ์กํฐ๋นํฐ๋ฅผ ์คํ์ํฌ์ ์๋ ๋ช๊ฐ์ง ์ฌํญ์ด ์์ต๋๋ค.
- ์์คํ
์์
PendingIntent
์ ํตํ์ฌ ์คํ์ํค๋ - ์์คํ
๋ธ๋ก๋ ์บ์คํธ๋ฅผ ๋ฐ์์ ์คํ์ํค๋ ๊ฒฝ์ฐ (
ACTION_NEW_OUTGOING_CALL
,SECRET_CODE_ACTION
) - ์ฌ์ฉ์๋ก๋ถํฐ
SYSTEM_ALERT_WINDOW
๊ถํ์ ๋ฐ์์ ์คํ์ํค๋
ํน๋ณํ ์ํฉ์ด ์๋ ์ด์์ PendingIntent
์ ํตํ์ฌ ์กํฐ๋นํฐ๋ฅผ ์คํ์ํค๋๊ฒ์ ๊ถ์ฅํฉ๋๋ค.
์ฑ์ด ๋ฐฑ๊ทธ๋ผ์ด๋ ์ํ์ ์์๋ ์ฌ์ฉ์์๊ฒ ์ค์ํ ์ ๋ณด๋ฅผ ์ ๋ฌํ๊ณ ์ถ์ผ๋ฉด ๋ฐ๋ก ์กํฐ๋นํฐ๋ฅผ ์คํ์ํค๋๊ฒ์ด ์๋๋ผ notification์ ํตํด ์ ๋ฌํด์ผํฉ๋๋ค.
Android Q์์ ์๋ฒ์์ push message๋ฅผ ๋ฐ๊ณ ๋ฐ๋ก ์กํฐ๋นํฐ๋ฅผ ์คํ์ํค๋ฉด ๋ค์๊ณผ ๊ฐ์ด ๊ฒฝ๊ณ ๋ฌธ๊ตฌ๊ฐ ๋์ต๋๋ค.
์ด๋ฌํ ์กํฐ๋นํฐ ์คํ ๋ฐฉ์์ Android Q๊ฐ ์ ์ ์ถ์๋๋ฉด ์ง์๋์ง ์์ต๋๋ค.
๋ค์๊ณผ ๊ฐ์ด Notification
์ ์ด์ฉํ์ฌ full-screen intent ๋ฅผ ์ด์ฉํ๋ฉด ์ฌ์ฉ์์๊ฒ ์กํฐ๋นํฐ๋ฅผ ์คํ์ํฌ์ ์๋ ๊ถํ์ ์ค ์ ์์ต๋๋ค.
setFullScreenIntent
private fun showIncoming CallNotification (channelId: String) {
// ...
NotificationCompat.Builder(this, channelId)
.setSmallIcon(R.drawable.noti_icon)
// ...
.setContentIntent(getContentIntent())
.setFullScreenIntent(getContentIntent(), true)
.build()
// ...
}
private fun getContentIntent(): PendingIntent {
val intent = Intent(a, LiveConsIncomingActivity::class.java)
intent.flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK
return PendingIntent.getActivity(this, REQUEST_CONTENT, intent, PendingIntent.FLAG_UPDATE_CURRENT)
}
์์ค์ฝ๋๋ฅผ ๋ณด๋ฉด setFullScreenIntent
๋ฉ์๋๋ฅผ ์ฌ์ฉํ๊ฒ์ ํ์ธํ ์ ์๋๋ฐ์. ํ๋ผ๋ฏธํฐ๋ก PendingIntent
๊ฐ ๋ค์ด๊ฐ๋๊ฒ์ ํ์ธํ ์ ์์ต๋๋ค. setFullScreenIntent
์ ๋ํ์ฌ ์ข ๋ ์์ธํ ์์๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค.
setFullScreenIntent
๋ฅผ ์ฌ์ฉํ๋ฉด Heads-up notification ์ด ๋ํ๋๊ณ ์๋์ผ๋ก ์ฌ๋ผ์ง์ง ์์ต๋๋ค.
๋ง์ฝ NotificagionChannel์ ์ค์๋๋ฅผ ์ค์ ํ์ง ์์ผ๋ฉด Heads-up notification์ ๋ํ๋์ง ์์ต๋๋ค.
Create a high-priority notification
์ฌ๊ธฐ์ ์ค์ํ ๋ถ๋ถ์ NotificaionChannel์์ ์ค์๋๋ฅผ ์ค์ ํ ๋ IMPORTANCE_HIGH
๋ก ์ค์ ํ์ง ์์์ ๊ฒฝ์ฐ์๋ Heads-up notification์ด ๋ํ๋์ง ์์ต๋๋ค.
๋ง์ง๋ง์ผ๋ก ์ฑ ํ๊ฒ์ด Android Q ์ด์ ์ผ ๊ฒฝ์ฐ USE_FULL_SCREEN_INTENT
๊ถํ์ ์ค์ ํด์ผํฉ๋๋ค.
PendingIntent์ ๋ํ์ฌ ์ข ๋ ์์ธํ ์ดํด๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค.
๋ฐฑ๊ทธ๋ผ์ด๋์์ push message๊ฐ ์์ ๊ฒฝ์ฐ notification์ ๋์ฐ๋๋ฐ notification manager ๊ฐ ์์คํ ์๋น์ค์์ ๊ด๋ฆฌํฉ๋๋ค.
notification์์ ์ฑ์ ์๋ ์กํฐ๋นํฐ๋ฅผ ์คํ ์ํค๋ ค๋ฉด intent์ ํตํ์ฌ ์คํ์์ผ์ผ ํ์ง๋ง ์ฑ๊ณผ ์ ํ ๋ค๋ฅธ ํ๋ก์ธ์ค์ด๋ฏ๋ก ์คํ์ํฌ์ ์๋ ๊ถํ์ด ์์ต๋๋ค.
์ด๋ PendingIntent
๋ฅผ ์ด์ฉํ๋ฉด intent๋ฅผ wrappingํ๊ณ notification manager ์๊ฒ ์กํฐ๋นํฐ๋ฅผ ์คํ์ํค๋ ๊ถํ์ ์ ๋ฌํ ์ ์์ต๋๋ค.
๊ทธ๋ฌ๋ฉด RemoteViews ์์ ๋ฒํผ๋ค์ ํด๋ฆญ์ก์ ์ ์ด๋ป๊ฒ ๊ตฌํํด์ผํ ๊น์?
RemoteViews ๋ ๋ค๋ฅธ ํ๋ก์ธ์ค์์ ๋์ํ๊ณ View๋ฅผ ์์๋ฐ์ ์ค์ View๊ฐ ์๋๋๋ค.
์ด๋ ๊ธฐ ๋๋ฌธ์ ๋ช๊ฐ์ง ์ ์ฝ์ฌํญ์ด ์์ต๋๋ค. ์ฌ์ฉํ ์ ์๋ View๊ฐ ์ ํ๋์ด์๊ธฐ ๋๋ฌธ์ ์ปค์คํ ๋ทฐ๋ฅผ ์ด์ฉํ ์ ์์ต๋๋ค.
๋ฒํผ์ ํด๋ฆญ์ ๊ตฌํํ ๋๋ setOnClickListener
๋ฐฉ์์ด ์๋ setOnClickPendingIntent
๋ฅผ ์ด์ฉํ์ฌ ๊ตฌํํด์ผ ํฉ๋๋ค.
ํด๋น ๋ฉ์๋์ ํ๋ผ๋ฏธํฐ๋ ๋ฒํผ์ id ๊ฐ๊ณผ PendingIntent
๊ฐ ์์ต๋๋ค.
๋ฒํผ ํด๋ฆญ ๋ก์ง์ ์ฝ๊ฒ ๊ด๋ฆฌํ๊ธฐ ์ํ์ฌ ๋ฐ๋ก ์กํฐ๋นํฐ๋ฅผ ์คํ์ํค์ง ์๊ณ ๋ธ๋ก๋์บ์คํธ๋ฅผ ์ด์ฉํ์์ต๋๋ค.
๋ธ๋ก๋์บ์คํธ ๋ฆฌ์๋ฒ ๋ถ๋ถ์ ๋ณด๋ฉด ๋ฒํผ์ ํด๋ฆญํ์ ๊ฒฝ์ฐ notification์ด ์ฌ๋ผ์ ธ์ผ ํ๊ธฐ ๋๋ฌธ์ notification manager์ cancel์ ํธ์ถํ์์ต๋๋ค.
๋ฒํผ์ ํด๋ฆญํ์ ๊ฒฝ์ฐ intent ์ ๋ณด์ Boolean ๊ฐ์ ์ถ๊ฐํ์๋๋ฐ์. ์๋ฝ๋ฒํผ์ ๋๋ ์ ๊ฒฝ์ฐ acceptCall ๊ฐ์ด true์ด๊ธฐ ๋๋ฌธ์ ๋ผ์ด๋ธ ์๋ด ์กํฐ๋นํฐ๋ฅผ PendingIntent
๋ฅผ ์ด์ฉํ์ฌ ์คํ์์ผฐ์ต๋๋ค.
์์ฝ์ ํ๋ฉด ๋ฐฑ๊ทธ๋ผ์ด๋ ์ํ์ผ๋ ์กํฐ๋นํฐ๋ ์คํ์ํฌ ์ ์๊ณ ์ฌ์ฉ์์๊ฒ notification์ ํตํ์ฌ ์กํฐ๋นํฐ๋ฅผ ์คํ์ํฌ ์ ์๋ ๊ถํ์ ์ค์ผํฉ๋๋ค.
๋ค์ ๊ธ์์๋ ์๋๋ก์ด๋ ๊ธฐ๊ธฐ ๊ณ ์ ์๋ณ์ ์ ํ ์ ๋ํ์ฌ ๋ค๋ค๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค.