Establecer Live Wallpaper Programmatically en dispositivo rooteado Android

¿Es posible de alguna manera establecer Live Wallpaper programáticamente usando mi aplicación?

Estoy trabajando en una aplicación cuyo propósito es elegir algunos de los fondos de pantalla animados instalados en el dispositivo y configurarlo como fondo de pantalla en vivo. Esta acción debe completarse a través de mi aplicación.

Mientras investigaba, encontré algunas respuestas que esto se puede hacer rooteando el dispositivo Android.

¿Puede alguien ayudarme a cómo hacer eso exactamente?

El sistema operativo Android anterior a Jelly Bean no le permite configurar programáticamente un fondo de pantalla en vivo. Por ahora, Jelly Bean apoya el cambio de Live Wallpaper programáticamente sin interacción del usuario

Perdón por decírselo a los que dicen no, pero es posible establecer un fondo de pantalla en vivo programáticamente SIN interacción del usuario. Requiere:

  1. Tu aplicación tiene privilegios de sistema
  2. Reflejo de Java (código super hacking)
  3. Una referencia de clase para el WallpaperService deseado (Live Wallpaper)

NOTA: Para el elemento n. ° 3, utilicé mi propio fondo de pantalla en vivo, clase MyWallpaperService

Esto solo se puede hacer si su aplicación tiene privilegios de sistema y tiene este permiso en el manifiesto:

  

Ahora, usando la reflexión, puede llamar a los métodos ocultos de WallpaperManager para establecer manualmente el fondo de pantalla en vivo:

 WallpaperManager manager = WallpaperManager.getInstance(context); Method method = WallpaperManager.class.getMethod("getIWallpaperManager", null); Object objIWallpaperManager = method.invoke(manager, null); Class[] param = new Class[1]; param[0] = ComponentName.class; method = objIWallpaperManager.getClass().getMethod("setWallpaperComponent", param); //get the intent of the desired wallpaper service. Note: I created my own //custom wallpaper service. You'll need a class reference and package //of the desired live wallpaper Intent intent = new Intent(WallpaperService.SERVICE_INTERFACE); intent.setClassName(context.getPackageName(), MyWallpaperService.class.getName()); //set the live wallpaper (throws security exception if you're not system-privileged app) method.invoke(objIWallpaperManager, intent.getComponent()); 

Consulte el código fuente:

  • LiveWallpaperActivity
  • LiveWallpaperPreview