Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Set Live Wallpaper Programmatically on Rooted Device Android

Is it possible somehow to set Live Wallpaper programmatically using my Application?

I am working on an Application that her purpose is to choose some of the Installed Live Wallpapers on the device and to set it as a Live Wallpaper. This action need to be completed via my Application.

As I was researching I found some answers that this can be done with rooting the Android Device?

Can some one help me out how to do that exactly?

like image 466
Naskov Avatar asked Dec 03 '12 12:12

Naskov


2 Answers

Android OS prior to Jelly Bean does not allow you to programatically set a live wallpaper. For now Jelly Bean supports changing the Live Wallpaper programtically without user interaction

like image 150
Kartik Domadiya Avatar answered Nov 15 '22 09:11

Kartik Domadiya


Sorry to break it to the nay sayers but it is possible to set a live wallpaper programmatically WITHOUT user interaction. It requires:

  1. Your app to be system-privileged
  2. <uses-permission android:name="android.permission.SET_WALLPAPER_COMPONENT" />
  3. Java reflection (super hacking code)
  4. A class reference to the desired WallpaperService (live Wallpaper)

NOTE: For item #3, I used my own live wallpaper, MyWallpaperService class

This can only be done if your app is system-privileged and has this permission in the manifest:

<uses-permission android:name="android.permission.SET_WALLPAPER_COMPONENT" />

Now, using reflection, you can call the hidden methods of WallpaperManager to manually set the live wallpaper:

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());

Refer to the source code:

  • LiveWallpaperActivity
  • LiveWallpaperPreview
like image 24
kpninja12 Avatar answered Nov 15 '22 08:11

kpninja12