Android的开机有两个阶段:Linux启动、Android启动。开机界面有三个:bootloader启动界面、kernel启动界面、bootanimation启动界面。
第一个开机界面
第一个开机界面在Bootloader启动Linux内核时的启动画面(Linux小企鹅的画面 在Android 1.5及以上版本已取消加载)。
在默认情况下,这个画面是不会出现的,除非我们在编译内核的时候,启用以下两个编译选项:
CONFIG_FRAMEBUFFER_CONSOLE
CONFIG_LOGO
第一个编译选项表示内核支持帧缓冲区控制台,它对应的配置菜单项为:
Device Drivers —> Graphics support —> Console display driver support —> Framebuffer Console support。
第二个编译选项表示内核在启动的过程中,需要显示LOGO,它对应的配置菜单项为:
Device Drivers —> Graphics support —> Bootup logo。
第二个开机界面
第二个开机画面是在init进程启动的过程中显示的,第二个开机画面的内容是由文件 initlogo.rle 来指定的,如果文件 initlogo.rle 文件不存在,或者在显示它的过程中出现异常,那么 Android 就以文本的方式来显示第二个开机画面,即向编号为0的控制台(/dev/tty0)输出“ANDROID”这7个字符。
第三个开机界面
第三个开机画面是由应用程序bootanimation来负责显示的。应用程序bootanimation在启动脚本init.rc中被配置成了一个服务,bootanimation 程序会检查系统制定目录下是否存在动画文件(.zip文件),如果不存在,则显示的第三个开机画面是Android系统默认的开机动画(明暗闪烁的 Android Logo),否则的话,第三个开机画面就是由用户自定义的开机动画。在这个基础上我们可以调用 mediaPlayer 的接口来实现播放视频
实现步骤
步骤一:
找一个确定会编译到的mk文件,比如device/rockchip/rk3288/rk3288.mk,把bootvideo.mp4入进该文件所在目录中,在该文件添加以下语句:
PRODUCT_COPY_FILES += device/rockchip/rk3288/bootanimation.zip:system/media/bootvideo.mp4
步骤二:
在源码 frameworks/base/cmds/bootanimation/BootAnimation.cpp 中添加代码
找到该位置添加视频路径
#define USER_SHUTDOWN_ANIMATION_FILE "/data/local/shutdownanimation.zip"
#define SYSTEM_SHUTDOWN_ANIMATION_FILE "/system/media/shutdownanimation.zip"
#define SYSTEM_BOOTVIDEO_FILE "/system/media/bootvideo.mp4" //视频路径
找到 BootAnimation::readyToRun() 函数在该位置添加视频标识
bool encryptedAnimation = atoi(decrypt) != 0 ||!strcmp("trigger_restart_min_framework", decrypt);
mVideo = false;
if(access(SYSTEM_BOOTVIDEO_FILE,R_OK) == 0)
mVideo = true;
else
mVideo = false;
ZipFileRO* zipFile = NULL;
找到 BootAnimation::threadLoop() 函数添加判断
if (mZip == NULL) {
r = android();
} else if (mVideo) {
r = video();
} else {
r = movie();
}
导入 IMediaHTTPService
#include
添加视频播放函数 BootAnimation::video()
bool BootAnimation::video()
{
int time_now,time_max=0;
eglMakeCurrent(mDisplay, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT);
eglDestroySurface(mDisplay, mSurface);
sp httpService;
sp mediaplayer = new MediaPlayer();
mediaplayer->reset();
mediaplayer->setDataSource(httpService,SYSTEM_BOOTVIDEO_FILE,NULL); //设置播放资源
mediaplayer->setLooping(false);
mediaplayer->setVideoSurfaceTexture(mFlingerSurface->getIGraphicBufferProducer());
mediaplayer->prepare();
mediaplayer->start();
if(mediaplayer->isPlaying())
mediaplayer->getDuration(&time_max);
while(true) {
mediaplayer->getCurrentPosition(&time_now);
if(exitPending())
break;
usleep(50);
if(time_now==time_max)
checkExit();
}
mediaplayer->stop();
mediaplayer->disconnect();
mediaplayer.clear();
return false;
}
最后修改头文件 frameworks/base/cmds/bootanimation/BootAnimation.h 并且添加增加的两个成员变量
sp mFlingerSurfaceControl;
sp mFlingerSurface;
+ bool mVideo;
+ bool video();
ZipFileRO *mZip;
int mHardwareRotation;
重新编译后我们即可看到开机播放视频的效果。
Android的开机有两个阶段:Linux启动、Android启动。开机界面有三个:bootloader启动界面、kernel启动界面、bootanimation启动界面。
第一个开机界面
第一个开机界面在Bootloader启动Linux内核时的启动画面(Linux小企鹅的画面 在Android 1.5及以上版本已取消加载)。
在默认情况下,这个画面是不会出现的,除非我们在编译内核的时候,启用以下两个编译选项:
CONFIG_FRAMEBUFFER_CONSOLE
CONFIG_LOGO
第一个编译选项表示内核支持帧缓冲区控制台,它对应的配置菜单项为:
Device Drivers —> Graphics support —> Console display driver support —> Framebuffer Console support。
第二个编译选项表示内核在启动的过程中,需要显示LOGO,它对应的配置菜单项为:
Device Drivers —> Graphics support —> Bootup logo。
第二个开机界面
第二个开机画面是在init进程启动的过程中显示的,第二个开机画面的内容是由文件 initlogo.rle 来指定的,如果文件 initlogo.rle 文件不存在,或者在显示它的过程中出现异常,那么 Android 就以文本的方式来显示第二个开机画面,即向编号为0的控制台(/dev/tty0)输出“ANDROID”这7个字符。
第三个开机界面
第三个开机画面是由应用程序bootanimation来负责显示的。应用程序bootanimation在启动脚本init.rc中被配置成了一个服务,bootanimation 程序会检查系统制定目录下是否存在动画文件(.zip文件),如果不存在,则显示的第三个开机画面是Android系统默认的开机动画(明暗闪烁的 Android Logo),否则的话,第三个开机画面就是由用户自定义的开机动画。在这个基础上我们可以调用 mediaPlayer 的接口来实现播放视频
实现步骤
步骤一:
找一个确定会编译到的mk文件,比如device/rockchip/rk3288/rk3288.mk,把bootvideo.mp4入进该文件所在目录中,在该文件添加以下语句:
PRODUCT_COPY_FILES += device/rockchip/rk3288/bootanimation.zip:system/media/bootvideo.mp4
步骤二:
在源码 frameworks/base/cmds/bootanimation/BootAnimation.cpp 中添加代码
找到该位置添加视频路径
#define USER_SHUTDOWN_ANIMATION_FILE "/data/local/shutdownanimation.zip"
#define SYSTEM_SHUTDOWN_ANIMATION_FILE "/system/media/shutdownanimation.zip"
#define SYSTEM_BOOTVIDEO_FILE "/system/media/bootvideo.mp4" //视频路径
找到 BootAnimation::readyToRun() 函数在该位置添加视频标识
bool encryptedAnimation = atoi(decrypt) != 0 ||!strcmp("trigger_restart_min_framework", decrypt);
mVideo = false;
if(access(SYSTEM_BOOTVIDEO_FILE,R_OK) == 0)
mVideo = true;
else
mVideo = false;
ZipFileRO* zipFile = NULL;
找到 BootAnimation::threadLoop() 函数添加判断
if (mZip == NULL) {
r = android();
} else if (mVideo) {
r = video();
} else {
r = movie();
}
导入 IMediaHTTPService
#include
添加视频播放函数 BootAnimation::video()
bool BootAnimation::video()
{
int time_now,time_max=0;
eglMakeCurrent(mDisplay, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT);
eglDestroySurface(mDisplay, mSurface);
sp httpService;
sp mediaplayer = new MediaPlayer();
mediaplayer->reset();
mediaplayer->setDataSource(httpService,SYSTEM_BOOTVIDEO_FILE,NULL); //设置播放资源
mediaplayer->setLooping(false);
mediaplayer->setVideoSurfaceTexture(mFlingerSurface->getIGraphicBufferProducer());
mediaplayer->prepare();
mediaplayer->start();
if(mediaplayer->isPlaying())
mediaplayer->getDuration(&time_max);
while(true) {
mediaplayer->getCurrentPosition(&time_now);
if(exitPending())
break;
usleep(50);
if(time_now==time_max)
checkExit();
}
mediaplayer->stop();
mediaplayer->disconnect();
mediaplayer.clear();
return false;
}
最后修改头文件 frameworks/base/cmds/bootanimation/BootAnimation.h 并且添加增加的两个成员变量
sp mFlingerSurfaceControl;
sp mFlingerSurface;
+ bool mVideo;
+ bool video();
ZipFileRO *mZip;
int mHardwareRotation;
重新编译后我们即可看到开机播放视频的效果。
举报