How to Set Wallpaper Programmatically in Android Kotlin (Home & Lock Screen)
Complete guide using Android WallpaperManager, Bitmap decoding, and Coroutines to set Home Screen, Lock Screen, or Both screens with NexWall 4K wallpapers.
⚠️ Production Security Warning — Read Before Publishing to App Store
The code samples in this guide use a Bearer token directly in client-side mobile code. This is for local development and prototyping only.
Any API key or Bearer token embedded inside a compiled Android APK or iOS IPA can be extracted in under 60 seconds using free tools like jadx-gui or apktool.
For production apps on Google Play / App Store, always use a backend proxy architecture:
Your backend holds the NexWall Bearer token securely. It proxies requests from your app, adds auth, and returns responses — keeping your API key permanently hidden from reverse engineers. Read API Docs →
1. Manifest Permissions & Gradle Setup
To set wallpapers programmatically in Android, declare the standard permission in your AndroidManifest.xml (no dangerous runtime prompt required):
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
<uses-permission android:name="android.permission.SET_WALLPAPER" />
<uses-permission android:name="android.permission.INTERNET" />
</manifest>
2. Download Bitmap with Coil & Kotlin Coroutines
Never block the Android Main UI Thread when downloading high-resolution 4K wallpapers. Use Kotlin Coroutines on Dispatchers.IO to load the bitmap and pass it to WallpaperManager:
import android.app.WallpaperManager
import android.content.Context
import android.graphics.Bitmap
import android.os.Build
import coil.ImageLoader
import coil.request.ImageRequest
import coil.request.SuccessResult
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.withContext
enum class WallpaperTarget {
HOME_SCREEN,
LOCK_SCREEN,
BOTH
}
object WallpaperHelper {
suspend fun applyWallpaper(
context: Context,
imageUrl: String,
target: WallpaperTarget
): Boolean = withContext(Dispatchers.IO) {
try {
// 1. Download full-resolution bitmap using Coil
val loader = ImageLoader(context)
val request = ImageRequest.Builder(context)
.data(imageUrl)
.allowHardware(false) // Required for WallpaperManager
.build()
val result = (loader.execute(request) as? SuccessResult)?.drawable
val bitmap = (result as? android.graphics.drawable.BitmapDrawable)?.bitmap
?: return@withContext false
// 2. Set wallpaper via WallpaperManager
val wallpaperManager = WallpaperManager.getInstance(context)
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
val flag = when (target) {
WallpaperTarget.HOME_SCREEN -> WallpaperManager.FLAG_SYSTEM
WallpaperTarget.LOCK_SCREEN -> WallpaperManager.FLAG_LOCK
WallpaperTarget.BOTH -> WallpaperManager.FLAG_SYSTEM or WallpaperManager.FLAG_LOCK
}
wallpaperManager.setBitmap(bitmap, null, true, flag)
} else {
wallpaperManager.setBitmap(bitmap)
}
true
} catch (e: Exception) {
e.printStackTrace()
false
}
}
}
3. Calling from Jetpack Compose or Activity
lifecycleScope.launch {
val success = WallpaperHelper.applyWallpaper(
context = this@WallpaperDetailActivity,
imageUrl = wallpaperItem.imageUrl,
target = WallpaperTarget.HOME_SCREEN
)
if (success) {
Toast.makeText(this@WallpaperDetailActivity, "Wallpaper Applied Successfully!", Toast.LENGTH_SHORT).show()
}
}
Want to test this endpoint right now?
Use the interactive Live Sandbox Console to test queries without writing code.