Android Kotlin 7 min read • Updated Sep 2026

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 Mobile App → Your Own Secure Backend → NexWall API

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.

Try In Sandbox