Android WallpaperService实现视频壁纸、相机桌面

xiaoxiao2021-02-28  62

这几天对前段事件比较火的视频壁纸产生了兴趣,也已经有了很多的实现,这里自己做下记录,也尝试着实现了一下相机壁纸,好玩是好玩就是有点费电。

为了兼容6.0之后的权限请求,可以看下之前写的Android6.0之后权限请求工具类

视频壁纸

先上效果图,gif的录制确实是个大坑

实现方法也挺简单的,都是继承了WallpaperService,只需要实现里面的一个onCreateEngine()方法即可。

实现一个继承了Engine的视频壁纸引擎,在surface创建后把MediaPlayer初始化好,之后只需要控制视频的播放和显示就好了。

/** * 视频壁纸的引擎 */ class VideoEngine extends Engine{ MediaPlayer mediaPlayer; @Override public void onSurfaceCreated(SurfaceHolder holder) { super.onSurfaceCreated(holder); initMediaPlayer(holder); } /** * 初始化MediaPlayer * @param surfaceHolder */ private void initMediaPlayer(SurfaceHolder surfaceHolder) { mediaPlayer = MediaPlayer.create(getApplicationContext(), R.raw.video); mediaPlayer.setSurface(surfaceHolder.getSurface()); mediaPlayer.setLooping( true); } @Override public void onVisibilityChanged(boolean visible) { super.onVisibilityChanged(visible); if(visible){ //可见时播放 mediaPlayer.start(); } else{ //不可见时暂停 mediaPlayer.pause(); } } @Override public void onDestroy() { super.onDestroy(); //停止释放MediaPlayer if(mediaPlayer.isPlaying()){ mediaPlayer.stop(); } mediaPlayer.release(); mediaPlayer = null; } } 配置文件中需要配置service,配置的label会在我们选择壁纸的时候显示

<service android:name= ".service.VideoWallpaperService" android:label= "@string/video_wallpaper" android:permission= "android.permission.BIND_WALLPAPER"> <intent-filter> <action android:name="android.service.wallpaper.WallpaperService" /> </intent-filter> <meta-data android:name= "android.service.wallpaper" android:resource= "@xml/video_wallpaper" /> </service> xml文件,里面可以设置thumbnail,description和settingsActivity等,thumbnail设置的图片会在我们选择壁纸的时候显示,便于识别

<?xml version="1.0" encoding="utf-8"?> <!--选择壁纸时显示的缩略图--> <wallpaper xmlns:android="http://schemas.android.com/apk/res/android" android:thumbnail= "@mipmap/ic_launcher" android:description= "@string/video_description" /> 权限

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

相机桌面

同上也放一个很渣的gif图

实现和上面的视频差不多,同样是用了SurfaceHolder显示,只是用了Camera。

有意思的是我们可以接受处理桌面上的触摸事件,比如在接受到接受到点击事件的时候拍照保存之类的,还是蛮有意思的。

/** * 相机壁纸的引擎 */ class CameraEngine extends Engine { Camera camera; @Override public void onCreate(SurfaceHolder surfaceHolder) { super.onCreate(surfaceHolder); //接受触摸事件 setTouchEventsEnabled( true); } @Override public void onTouchEvent(MotionEvent event) { super.onTouchEvent(event); //可以在这里处理添加触摸事件,如点击拍照 } @Override public void onVisibilityChanged(boolean visible) { super.onVisibilityChanged(visible); if(visible){ startPreview(); } else{ stopPreview(); } } @Override public void onDestroy() { stopPreview(); super.onDestroy(); } /** * 开始预览 */ private void startPreview() { camera = Camera.open(); //需要旋转90度 camera.setDisplayOrientation( 90); try { camera.setPreviewDisplay(getSurfaceHolder()); camera.startPreview(); } catch (IOException e) { e.printStackTrace(); } } /** * 关闭预览 */ private void stopPreview() { if (camera != null) { camera.stopPreview(); camera.release(); camera = null; } } } 几乎相同的配置

<service android:name= ".service.CameraWallpaperService" android:label= "@string/camera_wallpaper" android:permission= "android.permission.BIND_WALLPAPER"> <intent-filter> <action android:name="android.service.wallpaper.WallpaperService" /> </intent-filter> <meta-data android:name= "android.service.wallpaper" android:resource= "@xml/camera_wallpaper" /> </service> 几乎相同的xml

<?xml version="1.0" encoding="utf-8"?> <!--选择壁纸时显示的缩略图--> <wallpaper xmlns:android="http://schemas.android.com/apk/res/android" android:thumbnail= "@mipmap/ic_launcher" android:description= "@string/camera_description" />

权限

因为需要使用相机,所以需要获取提供相机权限 <uses-permission android:name="android.permission.CAMERA" /> <uses-permission android:name="android.permission.SET_WALLPAPER" /> <uses-feature android:name="android.hardware.camera" /> <uses-feature android:name="android.hardware.camera.autofocus" />

调用

直接使用指定壁纸,传入Service组件

Intent intent = new Intent(WallpaperManager.ACTION_CHANGE_LIVE_WALLPAPER); intent.putExtra(WallpaperManager.EXTRA_LIVE_WALLPAPER_COMPONENT, new ComponentName(context, VideoWallpaperService.class)); startActivity(intent);

项目源码
转载请注明原文地址: https://www.6miu.com/read-2619320.html

最新回复(0)