中企动力做网站多少钱,凡科快图怎么制作图片,广告推广怎么赚钱,福建做网站公司排名code小生,一个专注 Android 领域的技术平台公众号回复 Android 加入我的安卓技术群作者#xff1a;7_px链接#xff1a;https://www.jianshu.com/p/fc5cf284abbb声明#xff1a;本文已获7_px授权发表#xff0c;转发等请联系原作者授权一、概述#xff1a; 壁纸运行在一个… code小生,一个专注 Android 领域的技术平台公众号回复 Android 加入我的安卓技术群作者7_px链接https://www.jianshu.com/p/fc5cf284abbb声明本文已获7_px授权发表转发等请联系原作者授权一、概述 壁纸运行在一个Android服务之中这个服务的名字叫做WallpaperService。当用户选择了一个壁纸之后此壁纸所对应的WallpaperService便会启动并开始进行壁纸的绘制工作。Engine是WallpaperService中的一个内部类实现了壁纸窗口的创建以及Surface的维护工作。Engine内部实现了SurfaceView我们只需要在其内部利用MediaPlayer SurfaceView就可以播放动态壁纸了。二、实现 WallpaperService需要一个xml去配置然后在AndroidManifest.xml中声明wallpaper xmlns:androidhttp://schemas.android.com/apk/res/androidandroid:thumbnailmipmap/icon_lacation_black___cmwallpaper继承WallpaperService实现我们自己的壁纸服务VideoLiveWallpaperpublic 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配置 serviceandroid:name.VideoLiveWallpaperandroid:labelstring/app_nameandroid:permissionandroid.permission.BIND_WALLPAPERandroid:process:wallpaper intent-filter action android:nameandroid.service.wallpaper.WallpaperService / intent-filter meta-dataandroid:nameandroid.service.wallpaperandroid:resourcexml/wallpaper / service重点在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() {Overridepublic 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() {Overridepublic void onCompleted() { progressBar.setVisibility(View.GONE); }Overridepublic void onError(Throwable e) { progressBar.setVisibility(View.GONE); }Overridepublic 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:手把手教你如何优雅的实现APP启动速度优化登不上高峰看到的风景始终有限