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

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

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

视频壁纸

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


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

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

  1. /**
  2. * 视频壁纸的引擎
  3. */
  4. class VideoEngine extends Engine{
  5. MediaPlayer mediaPlayer;
  6. @Override
  7. public void onSurfaceCreated(SurfaceHolder holder) {
  8. super.onSurfaceCreated(holder);
  9. initMediaPlayer(holder);
  10. }
  11. /**
  12. * 初始化MediaPlayer
  13. * @param surfaceHolder
  14. */
  15. private void initMediaPlayer(SurfaceHolder surfaceHolder) {
  16. mediaPlayer = MediaPlayer.create(getApplicationContext(), R.raw.video);
  17. mediaPlayer.setSurface(surfaceHolder.getSurface());
  18. mediaPlayer.setLooping( true);
  19. }
  20. @Override
  21. public void onVisibilityChanged(boolean visible) {
  22. super.onVisibilityChanged(visible);
  23. if(visible){
  24. //可见时播放
  25. mediaPlayer.start();
  26. } else{
  27. //不可见时暂停
  28. mediaPlayer.pause();
  29. }
  30. }
  31. @Override
  32. public void onDestroy() {
  33. super.onDestroy();
  34. //停止释放MediaPlayer
  35. if(mediaPlayer.isPlaying()){
  36. mediaPlayer.stop();
  37. }
  38. mediaPlayer.release();
  39. mediaPlayer = null;
  40. }
  41. }
配置文件中需要配置service,配置的label会在我们选择壁纸的时候显示

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

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

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

相机桌面

同上也放一个很渣的gif图



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

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

  1. /**
  2. * 相机壁纸的引擎
  3. */
  4. class CameraEngine extends Engine {
  5. Camera camera;
  6. @Override
  7. public void onCreate(SurfaceHolder surfaceHolder) {
  8. super.onCreate(surfaceHolder);
  9. //接受触摸事件
  10. setTouchEventsEnabled( true);
  11. }
  12. @Override
  13. public void onTouchEvent(MotionEvent event) {
  14. super.onTouchEvent(event);
  15. //可以在这里处理添加触摸事件,如点击拍照
  16. }
  17. @Override
  18. public void onVisibilityChanged(boolean visible) {
  19. super.onVisibilityChanged(visible);
  20. if(visible){
  21. startPreview();
  22. } else{
  23. stopPreview();
  24. }
  25. }
  26. @Override
  27. public void onDestroy() {
  28. stopPreview();
  29. super.onDestroy();
  30. }
  31. /**
  32. * 开始预览
  33. */
  34. private void startPreview() {
  35. camera = Camera.open();
  36. //需要旋转90度
  37. camera.setDisplayOrientation( 90);
  38. try {
  39. camera.setPreviewDisplay(getSurfaceHolder());
  40. camera.startPreview();
  41. } catch (IOException e) {
  42. e.printStackTrace();
  43. }
  44. }
  45. /**
  46. * 关闭预览
  47. */
  48. private void stopPreview() {
  49. if (camera != null) {
  50. camera.stopPreview();
  51. camera.release();
  52. camera = null;
  53. }
  54. }
  55. }
几乎相同的配置

  1. <service
  2. android:name= ".service.CameraWallpaperService"
  3. android:label= "@string/camera_wallpaper"
  4. android:permission= "android.permission.BIND_WALLPAPER">
  5. <intent-filter>
  6. <action android:name="android.service.wallpaper.WallpaperService" />
  7. </intent-filter>
  8. <meta-data
  9. android:name= "android.service.wallpaper"
  10. android:resource= "@xml/camera_wallpaper" />
  11. </service>
几乎相同的xml

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

权限

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

调用

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

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


项目源码

猜你喜欢

转载自blog.csdn.net/mp624183768/article/details/80951557