BootAnimation 添加视频播放功能

上节我们讲到自定义的方式设置开机动画,系统默认只能使用图片轮播的方式来设置开机动画,表现力有限。如果开机能播放视频,那开机动画会更为炫酷,同时还能满足开机播放广告的"变态需求"。接下来我们就来实操一下。

修改 frameworks/base/cmds/bootanimation/BootAnimation.h 文件:

cpp 复制代码
// 添加头文件
#include <media/mediaplayer.h>
#include <media/IMediaHTTPService.h>

class BootAnimation : public Thread, public IBinder::DeathRecipient
{
    //......
    bool android();
    bool movie();
    // BootAnimation 类添加成员函数,video 函数用于播放视频
    bool video();
    //.....
}

修改 frameworks/base/cmds/bootanimation/BootAnimation.cpp 文件,实现 video 函数:

cpp 复制代码
const char *videoPath = "/system/media/bootvideo.mp4";
bool BootAnimation::video() {
    const float MAX_FPS = 60.0f;
    const float CHECK_DELAY = ns2us(s2ns(1) / MAX_FPS);
    // 屏幕显示初始化
    eglMakeCurrent(mDisplay, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT);
    eglDestroySurface(mDisplay, mSurface);

    // 播放视频
    sp<MediaPlayer> mp = new MediaPlayer();
    mp->reset();
    mp->setDataSource(NULL, videoPath, NULL);
    mp->setVideoSurfaceTexture(mFlingerSurface->getIGraphicBufferProducer());
    mp->prepare();
    mp->start();

    //设置音量
    mp->setVolume(1.0, 1.0);

    //等Launcher启动完成
    while(true) {
        if(exitPending()) {
            break;
        }   
        usleep(CHECK_DELAY);
        checkExit();
    }

    //等开机视频播放完成
    while (mp->isPlaying()) {
        usleep(200000);
    }

    ALOGD("bootvideo play finish");

    mp->stop();
    mp->disconnect();
    mp.clear();
    return true;
}

实现也很简单,就是使用系统服务 MediaPlayer 播放视频。

接着修改播放动画部分的代码 frameworks/base/cmds/bootanimation/BootAnimation.cpp

cpp 复制代码
bool BootAnimation::threadLoop()
{
    bool r;
    // We have no bootanimation file, so we use the stock android logo
    // animation.

    // 播放视频
    r = video();

    // 注释掉播放动画的代码
    // if (mZipFileName.isEmpty()) {
    //     r = android();
    // } else {
    //     r = movie();
    // }

    eglMakeCurrent(mDisplay, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT);
    eglDestroyContext(mDisplay, mContext);
    eglDestroySurface(mDisplay, mSurface);
    mFlingerSurface.clear();
    mFlingerSurfaceControl.clear();
    eglTerminate(mDisplay);
    eglReleaseThread();
    IPCThreadState::self()->stopProcess();
    return r;
}

最后修改 selinux 配置文件

先修改 system/sepolicy/prebuilts/api/29.0/public/ 目录下的 bootanim.temediaserver.te

bash 复制代码
# bootanim.te
binder_call(bootanim, surfaceflinger)
# 添加 bootanim 对 mediaserver 的访问权限
binder_call(bootanim, mediaserver)
binder_call(bootanim, audioserver)

# ......

allow bootanim audioserver_service:service_manager find;
allow bootanim surfaceflinger_service:service_manager find;
# 使得 bootanim 可以从 service_manager 获取到 mediaserver 服务
allow bootanim mediaserver_service:service_manager find;



# mediaserver.te
binder_use(mediaserver)
binder_call(mediaserver, binderservicedomain)
binder_call(mediaserver, appdomain)
# mediaserver 可以通过 binder 访问 bootanim
binder_call(mediaserver, bootanim)
binder_service(mediaserver)

接着修改 system/sepolicy/public 目录下的 bootanim.temediaserver.te

bash 复制代码
# bootanim.te
binder_call(bootanim, surfaceflinger)
# 添加 bootanim 对 mediaserver 的访问权限
binder_call(bootanim, mediaserver)
binder_call(bootanim, audioserver)

# ......

allow bootanim audioserver_service:service_manager find;
allow bootanim surfaceflinger_service:service_manager find;
# 使得 bootanim 可以从 service_manager 获取到 mediaserver 服务
allow bootanim mediaserver_service:service_manager find;



# mediaserver.te
binder_use(mediaserver)
binder_call(mediaserver, binderservicedomain)
binder_call(mediaserver, appdomain)
# mediaserver 可以通过 binder 访问 bootanim
binder_call(mediaserver, bootanim)
binder_service(mediaserver)

接着 将 MP4 文件预制到 /system/media/bootvideo.mp4 目录下, 重新编译系统,启动虚拟机就可以看到自定义的开机界面了:

bash 复制代码
source build/envsetup.sh
lunch rice14-eng
m
emulator

关于

我叫阿豪,2015 年本科毕业于国防科学技术大学指挥信息系统专业,毕业后从事信息化装备的研发工作,主要研究方向是 Android Framework 与 Linux Kernel。

如果你对 Android Framework 感兴趣或者正在学习 Android Framework,可以关注我的微信公众号和抖音,我会持续分享我的学习经验,帮助正在学习的你少走一些弯路。学习过程中如果你有疑问或者你的经验想要分享给大家可以添加我的微信,我拉你进技术交流群。

相关推荐
曾凡宇先生44 分钟前
无法远程连接 MySQL
android·开发语言·数据库·sql·tcp/ip·mysql·adb
zhangphil2 小时前
Android GPU的RenderThread Texture upload上传Bitmap优化prepareToDraw
android
柿蒂4 小时前
聊聊SliverPersistentHeader优先消费滑动的设计
android·flutter
假装多好1235 小时前
android三方调试几个常用命令
android·1024程序员节·三方,gms
侧耳4295 小时前
android11禁止安装apk
android·java·1024程序员节
JohnnyDeng946 小时前
ArkTs-Android 与 ArkTS (HarmonyOS) 存储目录全面对比
android·harmonyos·arkts·1024程序员节
2501_915918417 小时前
iOS 26 查看电池容量与健康状态 多工具组合的工程实践
android·ios·小程序·https·uni-app·iphone·webview
limingade7 小时前
手机摄像头如何识别体检的色盲检查图的数字和图案(下)
android·1024程序员节·色盲检查图·手机摄像头识别色盲图案·android识别色盲检测卡·色盲色弱检测卡
文火冰糖的硅基工坊7 小时前
[嵌入式系统-150]:智能机器人(具身智能)内部的嵌入式系统以及各自的功能、硬件架构、操作系统、软件架构
android·linux·算法·ubuntu·机器人·硬件架构
2501_915909068 小时前
iOS 架构设计全解析 从MVC到MVVM与使用 开心上架 跨平台发布 免Mac
android·ios·小程序·https·uni-app·iphone·webview