Single-screen Android app. Tap Play → brown noise runs forever, screen-off included. Tap Stop → silence.
- Light Phone 3 / LightOS (Android 8.1, API 27)
- Sideloaded via developer mode. No Play Store.
Requires Android SDK with build-tools 28.0.3 and platform android-27.
- Open this folder as an existing project.
- Let Gradle sync.
- Build → Build Bundle(s) / APK(s) → Build APK(s).
- APK lands at
app/build/outputs/apk/debug/app-debug.apk.
# one-time: generate the wrapper jar (run inside the project root)
gradle wrapper --gradle-version 5.6.4
# then build
./gradlew assembleDebug
adb install -r app/build/outputs/apk/debug/app-debug.apk
| File | Role |
|---|---|
BrownNoiseGenerator.kt |
AudioTrack streaming generator. Leaky integrator over Gaussian white noise → brown noise. |
NoiseService.kt |
Foreground Service. Creates notification channel, calls startForeground(), holds PARTIAL_WAKE_LOCK so CPU keeps feeding the buffer during screen-off. |
MainActivity.kt |
Single Activity. Toggle button starts/stops the service. Activity finish does not stop playback. |
- No
FOREGROUND_SERVICEpermission needed — that requirement starts at API 28. - The leaky integrator (
runningSum * 0.999) prevents DC drift while preserving the −6 dB/octave spectral slope of brown noise. START_STICKYmeans Android will restart the service after a kill, resuming playback automatically.