首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在带根的Android设备上以编程方式设置Live Wallpaper

在带根的Android设备上以编程方式设置Live Wallpaper
EN

Stack Overflow用户
提问于 2012-12-03 20:39:27
回答 2查看 6K关注 0票数 5

是否可以使用我的应用程序以编程方式设置Live Wallpaper?

我正在开发一个应用程序,她的目的是在设备上选择一些已安装的Live墙纸,并将其设置为Live墙纸。此操作需要通过我的应用程序完成。

当我研究的时候,我发现了一些答案,这可以通过根Android设备来完成?

有没有人能帮我解决这个问题呢?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-12-06 20:08:01

早于Jelly Bean的Android操作系统不允许您以编程方式设置活动墙纸。目前,Jelly Bean支持在无需用户交互的情况下以编程方式更改活动墙纸

票数 5
EN

Stack Overflow用户

发布于 2015-09-18 02:08:35

很抱歉打断那些唱反调的人,但可以在没有用户交互的情况下以编程方式设置活动墙纸。它需要:

  1. Your app to be system-privileged
  2. <uses-permission android:name="android.permission.SET_WALLPAPER_COMPONENT" />
  3. Java reflection (超级黑客代码)
  4. 对所需WallpaperService (实时墙纸)的类引用

注意:对于项目#3,我使用了我自己的活动墙纸,MyWallpaperService类

只有当您的应用程序具有系统权限并且在清单中具有此权限时,才能执行此操作:

代码语言:javascript
复制
<uses-permission android:name="android.permission.SET_WALLPAPER_COMPONENT" />

现在,使用反射,您可以调用WallpaperManager的隐藏方法来手动设置活动墙纸:

代码语言:javascript
复制
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());

请参考源代码:

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13683464

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档