Get Started
์๋ฉด ์ธก์ ์ ์๋ด ์ฌํญ์ ๋ฐ๋ผ์ฃผ์๊ธฐ ๋ฐ๋๋๋ค.
Asleep์ ์๋ฉด ์ธก์ /๋ถ์ ๊ธฐ๋ฅ์ ์ ํํ๊ฒ ํ ์คํธํ๋ ค๋ฉด, โจํ ์คํธ ํ๊ฒฝ ๊ฐ์ด๋๋ฅผ ๋ฐ๋์ ๋ฐ๋ผ์ฃผ์๊ธฐ ๋ฐ๋๋๋ค. ์ด ๊ฐ์ด๋๋ฅผ ์ค์ํ์ง ์์ ํ๊ฒฝ์์ ์ป์ ์๋ฉด ๋ถ์ ๊ฒฐ๊ณผ๋ โจ์ค์ ์๋ฉด ํจํด๊ณผ ์ ํํ๊ฒ ์ผ์นํ์ง ์์ ์ ์์์ ์ ์ํด์ฃผ์ธ์.
- ์๋ฉด ์ธก์ ์ ์ต์ 20๋ถ ์ด์์ ์ค๋์ค๊ฐ ์ ๋ก๋ ๋์ด์ผ ๋ถ์์ด ์์๋๋ฉฐ, ๊ทธ ์ดํ๋ก๋ ํ๋(๊ณ์ฝ ์กฐ๊ฑด)์ ๋ฐ๋ผ 5๋ถ ๋๋ 20๋ถ ๊ฐ๊ฒฉ์ผ๋ก ๋ถ์ํฉ๋๋ค.
๐ Test Environment Guideline ํ์ธํ๊ธฐ
1. Requirements
1.1 Minimum requirements on Asleep SDK for Android
- Android 8.0 (API level 26) ํน์ ๋ ๋์ ๋ฒ์
- Java 1.8 ํน์ ๋ ๋์ ๋ฒ์
- Android Gradle plugin 8.0 ํน์ ๋ ๋์ ๋ฒ์
1.2 API Key
์์ด์ฌ๋ฆฝ SDK๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํด์๋ API key๊ฐ ํ์ํฉ๋๋ค.
API key๋ฅผ ๋ฐ๊ธํ๋ ๋ฐฉ๋ฒ์ ๋ํด์๋ ์ด ๋งํฌ Generate API key๋ฅผ ์ฐธ๊ณ ํ์ธ์.
2. Getting Ready
2.1 Install Asleep SDK and Settings
- Android Studio๋ฅผ ์ด์ฉํ์ฌ ํ๋ก์ ํธ๋ฅผ ์์ฑํฉ๋๋ค.
- ์์ฑ๋ ํ๋ก์ ํธ ํด๋์ [root]/app/libs ํด๋์ AsleepSDK.aar ํ์ผ์ ์ถ๊ฐํฉ๋๋ค.
- AndroidManifest.xml ํ์ผ์ ์ด์ด ํผ๋ฏธ์ ์ ์ถ๊ฐํฉ๋๋ค.
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools">
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<uses-permission android:name="android.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS" />
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
...
REQUEST_IGNORE_BATTERY_OPTIMIZATIONS ๊ถํ์ ํ์๊ฐ ์๋๋๋ค.
๋ค๋ง, ๋์ฆ ๋ชจ๋์ ๋น ์ง๋ ๊ฒ์ ๋ฐฉ์งํ๊ธฐ ์ํด ํด๋น ๊ถํ์ด ์์ผ๋ฉด ๋์์ด ๋ ์ ์์ต๋๋ค.
https://developer.android.com/training/monitoring-device-state/doze-standby
FOREGROUND_SERVICE ๊ถํ์ ์ฑ ๊ฐ๋ฐ์ ํ์ํ ์ ์์ต๋๋ค.
๊ฐ๋ฐํ ์ฑ์ด ์ฌ์ฉ์๊ฐ ์ ์๋ ์๊ฐ์๋ ๋์ํ๊ฒ ํ๋ ค๋ฉด ์ด ๊ธฐ๋ฅ์ ์ฌ์ฉํ์ฌ์ผ ํฉ๋๋ค.
https://developer.android.com/guide/components/foreground-services
- ์ฑ ์์ค์ build.gradle ํ์ผ์ ์ด์ด okhttp, gson, npy ๋ฐ libs ํด๋์ *.aar์ ์ถ๊ฐํฉ๋๋ค.
plugins {
...
}
android {
...
}
dependencies {
...
implementation 'org.jetbrains.bio:npy:0.3.5'
implementation 'com.squareup.okhttp3:okhttp:4.9.0'
implementation 'com.google.code.gson:gson:2.9.1'
implementation fileTree(dir: 'libs', include: ['*.aar', '*.jar'], exclude: [])
}
- ์ ์ ํ ์์น์ permission ํ๋์ ์ํ source code๋ฅผ ์์ฑํฉ๋๋ค.
ActivityCompat.requestPermissions(this, arrayOf(Manifest.permission.RECORD_AUDIO), 0)
3. Sleep Tracking with Asleep SDK
3.1 Step 1: Initialize the Asleep SDK
initAsleepConfig ํ์ฌ AsleepConfig ๋ฐ์์ต๋๋ค.
apiKey, userId(๊ธฐ์กด์ ๋ฐ์ ๊ฒ์ด ์๋ค๋ฉด null), baseUrl(proxy server์ ์ฃผ์, ์๋ค๋ฉด null), callbackUrl(์ธ์ ์ด ๋ถ์๋ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ๋ ์ฃผ์), service(๊ฐ๋ฐํ ์ฑ์ ๋๋ค์)์ ์ ๋ ฅํฉ๋๋ค.
userId๊ฐ ์๋ค๋ฉด ์๋ก ์์ฑํ์ฌ onSuccess()์์ ๋ฐํํด์ฃผ๊ณ , ๊ธฐ์กด ์ฌ์ฉํ๋ userId๋ฅผ ์ ๋ ฅํ๋ฉด ๊ฒ์ฆ์ ๊ฑฐ์น ํ onSuccess()์์ ๋ฐํํด์ค๋๋ค.
๋ง์ฝ, ๊ธฐ์กด ์ฌ์ฉํ๋ userId๊ฐ Tracking ์ค์ด๋ผ๋ฉด SDK๋ด๋ถ์์ ์ข ๋ฃ ์ํต๋๋ค.
import ai.asleep.asleepsdk.Asleep
import ai.asleep.asleepsdk.data.AsleepConfig
import ai.asleep.asleepsdk.AsleepErrorCode
...
Asleep.initAsleepConfig(
context = applicationContext,
apiKey = "[input your apiKey]",
userId = "",
baseUrl = null,
callbackUrl = "",
service = "[input your AppName]",
object : Asleep.AsleepConfigListener {
override fun onSuccess(userId: String?, asleepConfig: AsleepConfig?) {
...
/* save userId and asleepConfig */
}
override fun onFail(errorCode: Int, detail: String) {
...
}
})
3.2 Step 2: Create SleepTrackingManager
initAsleepConfig์์ ๋ฐ์์จ AsleepConfig๋ฅผ ํ๋ผ๋ฉํฐ๋ก ์ ๋ ฅํฉ๋๋ค.
import ai.asleep.asleepsdk.tracking.SleepTrackingManager
...
var sleepTrackingManager = Asleep.createSleepTrackingManager(asleepConfig, object : SleepTrackingManager.TrackingListener {
override fun onCreate() {
}
override fun onUpload(sequence: Int) {
}
override fun onClose(sessionId: String) {
...
/* save sessionId */
}
override fun onFail(errorCode: Int, detail: String) {
}
})
3.3 Step 3: Start Tracking
- ์ธก์ ์์ํ๊ธฐ
์์์ ํ๋ฉด SleepTrackingManager ์์ฑ์ ๋ฑ๋กํ listener์ onUploadํจ์์์ 30์ด์ ํ๋ฒ์ฉ ์ํ์ค ๋๋ฒ๊ฐ ์ฝ๋ฐฑ๋ฉ๋๋ค.
sleepTrackingManager?.startSleepTracking()
- ์ธก์ ์ค ๋ถ์ํ๊ธฐ
sleepTrackingManager?.requestAnalysis(object : SleepTrackingManager.AnalysisListener {
override fun onSuccess(session: Session) {
Log.d("", "${session.toString()}")
}
}
session์ ๋ํ ์ ๋ณด๋ API>Data API>Get a session ์ฐธ์กฐ
3.4 Step 4: Stop Tracking
์ ์ง๋ฅผ ํ๋ฉด SleepTrackingManager ์์ฑ์ ๋ฑ๋กํ listener์ onCloseํจ์์์ sessionId๊ฐ ์ฝ๋ฐฑ๋ฉ๋๋ค.
sleepTrackingManager?.stopSleepTracking()
3.5 Step 5: Create Reports
initAsleepConfig์์ ๋ฐ์์จ AsleepConfig๋ฅผ ํ๋ผ๋ฉํฐ๋ก ์ ๋ ฅํฉ๋๋ค.
val reports = Asleep.createReports(asleepConfig)
3.6 Step 6: Get Report
- sessionId ํ๋์ ๊ฒฐ๊ณผ ๋ฐ์์ค๊ธฐ
sleepTracking์ ์ ์งํ ๋ ๋ฐ์์จ sessionId๋ฅผ ํ๋ผ๋ฉํฐ๋ก ์ ๋ ฅํฉ๋๋ค.
reports?.getReport(sessionId, object : Reports.ReportListener {
override fun onSuccess(report: Report?) {
}
override fun onFail(errorCode: Int, detail: String) {
}
})
- ๋ ์ง๋ก ๊ฒฐ๊ณผ ๋ฐ์์ค๊ธฐ
val today = LocalDate.now()
reports?.getReports(today.minusDays(7).toString(), today.toString(), "DESC", 0, 20, object : Reports.ReportsListener {
override fun onSuccess(reports: List<SleepSession>?) {
}
override fun onFail(errorCode: Int, detail: String) {
}
})
3.7 Step 7: Remove Session
- ์ธก์ ๊ธฐ๋ก ์ญ์ ํ๊ธฐ
sessionId๋ฅผ ์ ๋ ฅํ์ฌ ํด๋น ์ธก์ ๊ธฐ๋ก์ ์ญ์ ํฉ๋๋ค.
reports?.deleteReport(sessionId, object : Reports.DeleteReportListener {
override fun onSuccess(sessionId: String?) {
}
override fun onFail(errorCode: Int, detail: String) {
}
})
- ๋์ ์ ๋ณด ์ ๋ถ ์ญ์ ํ๊ธฐ
userId์ ์ธก์ ๋ ๊ธฐ๋ก์ ์ ๋ถ ์ญ์ ํฉ๋๋ค. ์ญ์ ๋ userId๋ ๋์ด์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
Asleep.deleteUser(object : Asleep.DeleteUserIdListener {
override fun onSuccess(userId: String?) {
}
override fun onFail(errorCode: Int, detail: String) {
}
})
Updated over 1 year ago