- 新建APP 项目 实现 WallpaperService
public class MagicWallpaper extends WallpaperService { public final String TAG = this.getClass().getSimpleName(); @Override public Engine onCreateEngine() { Log.d(TAG, "->:onCreateEngine()"); // 1: 这里返回实现的动画引擎 return new VideoEngine(); } }
- 实现视频播放的引擎
class VideoEngine extends Engine { private MediaPlayer mp; public VideoEngine() { super(); } @Override public void onCreate(SurfaceHolder surfaceHolder) { super.onCreate(surfaceHolder); // Engine对象被创建时回调,这里可以做一些初始化的工作(例如 注册广播) Log.d(TAG, "->:VideoEngine -- onCreate()"); // 这里加载本地视频资源,初始化播放器 mp = MediaPlayer.create(getApplicationContext(), R.raw.magic); mp.setLooping(true); // 循环播放 mp.setVolume(0.0f, 0.0f);// 静音 } @Override public void onDestroy() { super.onDestroy(); //Engine对象被销毁时回调,这里可以做一些回收释放的操作(例如 注销广播) Log.d(TAG, "->:VideoEngine -- onDestroy()"); } @Override public void onVisibilityChanged(boolean visible) { super.onVisibilityChanged(visible); //显示、隐藏时切换,在桌面时为显示,跳转到别的App页面时为隐藏 :这里做视频的暂停和恢复播放 Log.d(TAG, "->:VideoEngine -- onVisibilityChanged() visible:" + visible); if (mp != null) { if (visible) { mp.start(); Log.d(TAG, "->:VideoEngine -- onVisibilityChanged() mp->start"); } else { mp.pause(); Log.d(TAG, "->:VideoEngine -- onVisibilityChanged() mp->pause"); } } } @Override public void onSurfaceCreated(SurfaceHolder holder) { super.onSurfaceCreated(holder); //SurfaceView创建时回调,视频MediaPlayer对象播放的视频输出在这个surface上 Log.d(TAG, "->:VideoEngine -- onSurfaceCreated()"); mp.setSurface(holder.getSurface()); mp.start(); Log.d(TAG, "->:VideoEngine -- onSurfaceCreated() start!"); } @Override public void onSurfaceDestroyed(SurfaceHolder holder) { super.onSurfaceDestroyed(holder); //Surface销毁时回调,这里销毁MediaPlayer,回收MediaPlayer if (mp != null) { Log.d(TAG, "->:VideoEngine -- onSurfaceDestroyed()"); mp.stop(); mp.release(); mp = null; } } }
- AndroidManifest.xml 里注册服务
其中的
- 资源配置
@xml/magic
在res目录下,新建xml文件夹 然后新建 xxxx.xml(如本例:magic.xml)
VideoEngine 里 的视频资源 R.raw.magic
在res目录下,新建raw文件夹 然后拷贝进来视屏素材(如本例:magic.mp4)ps: 视频资源放在本地,放在 res/raw 目录下,然后 R.raw.xxx.mp4 调用即可
@drawable/magic_thumbnail
在drawable目录下放一张动态桌面的缩略图,主要是用来,系统浏览动态桌面展示资源列表的一个缩略图
以上步骤基本就是一个动态视屏桌面的核心功能了,即完成了一个视频资源的动态壁纸,然后安装app ,即可在系统动态壁纸里看到自己的项目。
2、系统内置
-
在主干目录 **package/wallpapers/**下新建项目 MagicWallpaper
-
拷贝前面做的app的 res 和 src 目录到MagicWallpaper里
注意:src 只包含包名部分的路径,即src/com/xxx/xxx 这样子,不要main/java 这两层
-
将AndroidManifest.xml 拷贝到文件根目录,添加
-
编写Android.mk脚本
LOCAL_PATH := $(call my-dir) # Standalone Wallpaper picker app # ======================================================== include $(CLEAR_VARS) LOCAL_MODULE_TAGS := optional LOCAL_SRC_FILES := $(call all-subdir-java-files) $(call all-renderscript-files-under, src) LOCAL_CERTIFICATE := shared LOCAL_PACKAGE_NAME := MagicWallpaper LOCAL_SDK_VERSION := current # LOCAL_PRIVATE_PLATFORM_APIS与LOCAL_SDK_VERSION 二选一配置 #LOCAL_PRIVATE_PLATFORM_APIS := true include $(BUILD_PACKAGE)
- 最后如果系统有配置这个路径源码的编译,把这里新建的墙纸加入
例如我这边是
…/devices/mediatek/system/common/devices.mk 目录下脚本控制项目是否参与编译
ifeq ($(strip $(MSSI_MTK_LIVEWALLPAPER_APP)), yes) PRODUCT_PACKAGES += LiveWallpapersPicker # 这里加上自己的项目,就可以参与编译 PRODUCT_PACKAGES += MagicWallpaper endif