Android 仿火萤视频桌面 神奇的LiveWallPaper

此外,大家还记得在Android播放视频吗?

常规的做法有通过VideoView,除此以外还有通过MediaPlayer配合SurfaceView配合来实现,今天这个例子类似后者。

我们只需要通过MediaPlayer将解码的数据不断的输送到传入的Surface中即可。

class VideoEngine extends Engine {

private MediaPlayer mMediaPlayer;

@Override

public void onSurfaceCreated(SurfaceHolder holder) {

L.d("VideoEngine#onSurfaceCreated ");

super.onSurfaceCreated(holder);

mMediaPlayer = new MediaPlayer();

mMediaPlayer.setSurface(holder.getSurface());

try {

AssetManager assetMg = getApplicationContext().getAssets();

AssetFileDescriptor fileDescriptor = assetMg.openFd(“test1.mp4”);

mMediaPlayer.setDataSource(fileDescriptor.getFileDescriptor(),

fileDescriptor.getStartOffset(), fileDescriptor.getLength());

mMediaPlayer.setLooping(true);

mMediaPlayer.setVolume(0, 0);

mMediaPlayer.prepare();

mMediaPlayer.start();

} catch (IOException e) {

e.printStackTrace();

}

}

@Override

public void onVisibilityChanged(boolean visible) {

L.d("VideoEngine#onVisibilityChanged visible = " + visible);

if (visible) {

mMediaPlayer.start();

} else {

mMediaPlayer.pause();

}

}

@Override

public void onSurfaceDestroyed(SurfaceHolder holder) {

L.d("VideoEngine#onSurfaceDestroyed ");

super.onSurfaceDestroyed(holder);

mMediaPlayer.release();

mMediaPlayer = null;

}

代码非常简单,在onSurfaceCreated中去初始化mMediaPlayer,核心代码即为设置setSurface方法,这里我默认设置了静音。

onVisibilityChanged,即当桌面不可见时,我们要暂停播放,等回到桌面继续。

当onSurfaceDestroyed时释放资源~~

这样我们的VideoLiveWallpaper就写好了,别忘了他是个Service,需要我们去注册。

<service

android:name=“.VideoLiveWallpaper”

android:label=“@string/app_name”

android:permission=“android.permission.BIND_WALLPAPER”

android:process=“:wallpaper”>

<meta-data

android:name=“android.service.wallpaper”

android:resource=“@xml/livewallpaper” />

(3)设置为壁纸

注册完成后,我们在MainActivity中添加一个按钮点击设置为桌面背景,调用代码如下

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);

}

这样就完成了代码的初步编写啦~~

(4)增加一些参数的支持

刚才我们设置了默认是静音,可能有时候我们会希望能够动态去控制视频桌面的参数,正常应该尝试去使用settingsActivity,不过我觉得其实广播也挺合适的,无非就是Service(可能在独立的进程)和Activity等通信嘛~~

这里我们增加一个复选框,支持设置开启声音or关闭声音。

public static final String VIDEO_PARAMS_CONTROL_ACTION = “com.zhy.livewallpaper”;

public static final String KEY_ACTION = “action”;

public static final int ACTION_VOICE_SILENCE = 110;

public static final int ACTION_VOICE_NORMAL = 111;

class VideoEngine extends Engine {

// 省略其他代码

private BroadcastReceiver mVideoParamsControlReceiver;

@Override

public void onCreate(SurfaceHolder surfaceHolder) {

super.onCreate(surfaceHolder);

IntentFilter intentFilter = new IntentFilter(VIDEO_PARAMS_CONTROL_ACTION);

registerReceiver(mVideoParamsControlReceiver = new BroadcastReceiver() {

@Override

public void onReceive(Context context, Intent intent) {

L.d(“onReceive”);

int action = intent.getIntExtra(KEY_ACTION, -1);

switch (action) {

case ACTION_VOICE_NORMAL:

mMediaPlayer.setVolume(1.0f, 1.0f);

break;

case ACTION_VOICE_SILENCE:

mMediaPlayer.setVolume(0, 0);

break;

}

}

}, intentFilter);

}

@Override

public void onDestroy() {

unregisterReceiver(mVideoParamsControlReceiver);

super.onDestroy();

}

}

Engine还有onCreate和onDestroy声明周期方法,可以在onCreate中注册动态广播,当接受到发送的action为ACTION_VOICE_NORMAL则开启声音;接收到发送的ACTION_VOICE_SILENCE则为静音状态。

最后直接在VideoLiveWallpaper中添加两个静态方法用于发送广播即可:

public static void voiceSilence(Context context) {

Intent intent = new Intent(VideoLiveWallpaper.VIDEO_PARAMS_CONTROL_ACTION);

intent.putExtra(VideoLiveWallpaper.KEY_ACTION, VideoLiveWallpaper.ACTION_VOICE_SILENCE);

context.sendBroadcast(intent);

}

public static void voiceNormal(Context context) {

Intent intent = new Intent(VideoLiveWallpaper.VIDEO_PARAMS_CONTROL_ACTION);

intent.putExtra(VideoLiveWallpaper.KEY_ACTION, VideoLiveWallpaper.ACTION_VOICE_NORMAL);

context.sendBroadcast(intent);

}

在Actiivty中:

public class MainActivity extends AppCompatActivity {

private CheckBox mCbVoice;

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

mCbVoice = (CheckBox) findViewById(R.id.id_cb_voice);
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数初中级Android工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则近万的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

img

img

img

img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注:Android)

总结

找工作是个很辛苦的事情,而且一般周期都比较长,有时候既看个人技术,也看运气。第一次找工作,最后的结果虽然不尽如人意,不过收获远比offer大。接下来就是针对自己的不足,好好努力了。

最后为了节约大家的时间,我把我学习所用的资料和面试遇到的问题和答案都整理成了PDF文档

喜欢文章的话请关注、点赞、转发 谢谢!

《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》,点击传送门即可获取!

g src=“https://i-blog.csdnimg.cn/blog_migrate/af5cd3de4c57ad8d4b454575fbb802d2.jpeg” />

总结

找工作是个很辛苦的事情,而且一般周期都比较长,有时候既看个人技术,也看运气。第一次找工作,最后的结果虽然不尽如人意,不过收获远比offer大。接下来就是针对自己的不足,好好努力了。

最后为了节约大家的时间,我把我学习所用的资料和面试遇到的问题和答案都整理成了PDF文档

喜欢文章的话请关注、点赞、转发 谢谢!

[外链图片转存中…(img-fJWmTFJS-1712151478972)]

《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》,点击传送门即可获取!
  • 19
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值