Android怎么实现动态壁纸
发表于:2025-02-01 作者:千家信息网编辑
千家信息网最后更新 2025年02月01日,这篇文章主要介绍了Android怎么实现动态壁纸的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Android怎么实现动态壁纸文章都会有所收获,下面我们一起来看看吧。一、概
千家信息网最后更新 2025年02月01日Android怎么实现动态壁纸
这篇文章主要介绍了Android怎么实现动态壁纸的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Android怎么实现动态壁纸文章都会有所收获,下面我们一起来看看吧。
一、概述:
壁纸运行在一个Android服务之中,这个服务的名字叫做WallpaperService。当用户选择了一个壁纸之后,此壁纸所对应的WallpaperService便会启动并开始进行壁纸的绘制工作。
Engine是WallpaperService中的一个内部类,实现了壁纸窗口的创建以及Surface的维护工作。Engine内部实现了SurfaceView,我们只需要在其内部利用MediaPlayer + SurfaceView就可以播放动态壁纸了。
二、实现:
WallpaperService需要一个xml去配置,然后在AndroidManifest.xml中声明
继承WallpaperService实现我们自己的壁纸服务VideoLiveWallpaper
public class VideoLiveWallpaper extends WallpaperService { @Override public Engine onCreateEngine() { return new VideoEngine(); } class VideoEngine extends Engine { private MediaPlayer mMediaPlayer; @Override public void onCreate(SurfaceHolder surfaceHolder) { super.onCreate(surfaceHolder); } @Override public void onDestroy() { super.onDestroy(); } @Override public void onSurfaceCreated(SurfaceHolder holder) { super.onSurfaceCreated(holder); mMediaPlayer = new MediaPlayer(); mMediaPlayer.setSurface(holder.getSurface()); try { mMediaPlayer.setDataSource(new File(FileUtil.getDCIMCameraDir(), "hlj_wallpaper").getAbsolutePath()); mMediaPlayer.setLooping(true); mMediaPlayer.setVolume(0, 0); mMediaPlayer.prepare(); mMediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() { @Override public void onPrepared(MediaPlayer mp) { mMediaPlayer.start(); } }); } catch (IOException e) { e.printStackTrace(); } } @Override public void onSurfaceDestroyed(SurfaceHolder holder) { super.onSurfaceDestroyed(holder); mMediaPlayer.release(); mMediaPlayer = null; } @Override public void onVisibilityChanged(boolean visible) { if (visible) { mMediaPlayer.start(); } else { mMediaPlayer.pause(); } } }}
接着声明这个服务同时声明我们上面写的xml配置
重点在onSurfaceCreated方法中,这里为了可以动态切换不同的壁纸,我是指定去加载一个固定目录下的视频文件,然后不断的复制新文件到这个目录,因为一旦开启切换壁纸这个方法就会调用,所以当调用后再动态通知去更改路径不起作用。
所以我在更换壁纸前先清空
try { WallpaperManager.getInstance(getContext()) .clear(); } catch (IOException e) { e.printStackTrace(); }
再去复制需要替换的壁纸到指定目录
copyFile(file.getAbsolutePath(), new File(FileUtil.getDCIMCameraDir(), "hlj_wallpaper").getAbsolutePath()); /** * 复制单个文件 * * @param oldPath String 原文件路径 如:c:/fqf.txt * @param newPath String 复制后路径 如:f:/fqf.txt * @return boolean */ public void copyFile(final String oldPath, final String newPath) { progressBar.setVisibility(View.VISIBLE); Observable.create(new Observable.OnSubscribe() { @Override public void call(Subscriber super Boolean> subscriber) { try { int byteSum = 0; int byteRead ; File oldFile = new File(oldPath); if (oldFile.exists()) { //文件存在时 InputStream inStream = new FileInputStream(oldPath); //读入原文件 FileOutputStream fs = new FileOutputStream(newPath); byte[] buffer = new byte[1444]; while ((byteRead = inStream.read(buffer)) != -1) { byteSum += byteRead; //字节数 文件大小 System.out.println(byteSum); fs.write(buffer, 0, byteRead); } inStream.close(); subscriber.onNext(true); subscriber.onCompleted(); } } catch (Exception e) { System.out.println("复制单个文件操作出错"); e.printStackTrace(); subscriber.onCompleted(); } } }) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(new Observer () { @Override public void onCompleted() { progressBar.setVisibility(View.GONE); } @Override public void onError(Throwable e) { progressBar.setVisibility(View.GONE); } @Override public void onNext(Boolean aBoolean) { progressBar.setVisibility(View.GONE); setToWallPaper(getContext()); } }); }
setToWallPaper方法就是真正的开启设置壁纸操作了
public static void setToWallPaper(Context context) { final Intent intent = new Intent(WallpaperManager.ACTION_CHANGE_LIVE_WALLPAPER); intent.putExtra(WallpaperManager.EXTRA_LIVE_WALLPAPER_COMPONENT, new ComponentName(context, VideoLiveWallpaper.class)); context.startActivity(intent); }
关于"Android怎么实现动态壁纸"这篇文章的内容就介绍到这里,感谢各位的阅读!相信大家对"Android怎么实现动态壁纸"知识都有一定的了解,大家如果还想学习更多知识,欢迎关注行业资讯频道。
壁纸
文件
动态
服务
方法
目录
知识
路径
内容
单个
篇文章
切换
工作
配置
不同
不断
之中
价值
作用
同时
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
渭南网络安全宣传周启动仪式
腾讯云 会话管理服务器
唐山网络安全事件
用jsp对数据库操作
数字人民币 数据库
ibm服务器一直自动关机
数据库的基本逻辑单位
中兴南京软件开发一部
软件开发师退休后能去培训机构吗
广州网络安全建设有哪些
通用数据库访问 .net
vb读取数据保存数据库中
封闭式基金折价率 数据库
网络运维与网络安全好学吗
小学生网络安全事故典型案例
可以搜网络安全知识题的软件
去浙江铭轩网络技术有限公司
河南科之源互联网科技有限公司
江苏省公安厅网络安全
代号探戈数据库
数据库开发和软件开发哪个好
手机软件开发画布
cec 网络安全 上市公司
overhead数据库
计算机网络技术网站建设管理
ccs软件开发平台窗口图
上海京师网络技术公司
数据库怎么保存成log
读取矢量数据库数据
杨浦区一站式软件开发收费套餐