Android4.0.3修改启动动画和开机声音

简介:

1. Linux 系统启动,出现Linux小企鹅画面(reboot)(Android 1.5及以上版本已经取消加载图片);

  2. Android平台启动初始化,出现"A N D R I O D"文字字样画面;

  3. Android平台图形系统启动,出现含闪动的ANDROID字样的动画图片(start)。

  现在我们说的是第三种方式(基于模拟器):

  android开机动画叫源码位于frameworks/base/cmds/bootanimation下,这个程序会将/data/local/bootanimation.zip或/system/media/bootanimation.zip里面的png图片以动画的形式播放出来。

  首先,我们先来分析一下源码:

  frameworks/base/cmds/bootanimation/BootAnimation.cpp

  首先看一下定义的常量:

#define USER_BOOTANIMATION_FILE "/data/local/bootanimation.zip" 
#define SYSTEM_BOOTANIMATION_FILE "/system/media/bootanimation.zip" 
#define SYSTEM_ENCRYPTED_BOOTANIMATION_FILE "/system/media/bootanimation-encrypted.zip"
BootAnimation::readyToRun()

  进入一个if判断语句

if ((encryptedAnimation && 
(access(SYSTEM_ENCRYPTED_BOOTANIMATION_FILE, R_OK) == 0) && 
(mZip.open(SYSTEM_ENCRYPTED_BOOTANIMATION_FILE) == NO_ERROR)) || 
((access(USER_BOOTANIMATION_FILE, R_OK) == 0) && 
(mZip.open(USER_BOOTANIMATION_FILE) == NO_ERROR)) || 
((access(SYSTEM_BOOTANIMATION_FILE, R_OK) == 0) && 
(mZip.open(SYSTEM_BOOTANIMATION_FILE) == NO_ERROR))) { 
mAndroidAnimation = false; 
}
BootAnimation::threadLoop()

if (mAndroidAnimation) { 
r = Android(); // 执行android字体闪动的图片 
} else { 
r = movie(); // 执行bootanimation.zip中提供的动画图片 
}
==> BootAnimation::Android()会加载"images/android-logo-mask.png"和"images/android-logo-shine.png"

  ==> BootAnimation::movie()会加载bootanimation.zip中的内容

  我们下载的源码里默认是没有那些个.zip动画的,所以总会跳到android字体闪动的画面

  所以如果你系那个用.zip的动画那么把你做好的动画拷贝到编译好对应的目录下即可,然后执行make snod整合进img包就可以看到效果了

  如果你想修改android闪动的那两张图片的话,最简单的方法是直接替换图片,如果你懂openGL的话也可以自己做酷炫的动画

  那两张图片放在./frameworks/base/core/res/assets/images 目录下,一张镂空的android图,一张发光效果,动画效果就是下面那张发光的效果图不断左右移动。

  我是用Photoshop直接修改的

  修改完后直接替换,然后再 mmm frameworks/base , make snod 即可

  以下是我修改后的效果图:

  

  看样子还想那么回事

  接下来我们给系统添加开机声音

  由于动画是在BootAnimation播放的,所以我们的声音肯定也在这个类中做,照猫画虎

  首先在BootAnimation.h添加方法的声明和头文件的引用

#include <media/AudioSystem.h> 
#include <media/mediaplayer.h>

  添加方法 void bootMusic();

  

  然后在BootAnimation.cpp中实现这个方法:

void BootAnimation::bootMusic() 

int index; 
MediaPlayer* mp = new MediaPlayer(); 
if (mp->setDataSource("/system/etc/poweron.wav", NULL) == NO_ERROR) { 
mp->setAudioStreamType(AUDIO_STREAM_ENFORCED_AUDIBLE); 
mp->prepare(); 

AudioSystem::getStreamVolumeIndex(AUDIO_STREAM_ENFORCED_AUDIBLE, &index); 
if (index != 0) { 
mp->seekTo(0); 
mp->start(); 

}
请注意这个目录setDataSource("/system/etc/poweron.wav", NULL)

  其实这个目录是随便写的,你想从哪个目录读这个文件就从哪个目录读好了,但是你要把这个文件放在对应的目录下

  比如,这个目录是system/etc (这个目录是android系统的目录,不是源码的目录),这个文件夹是只有读权限而没有写权限的,所有你不用试adb shell了,没用的

  其实system/etc这个目录对应的是我们编译后out文件夹下的xxx,然后在system/etc,所以你把poweron.wav放到这里就行了,当然如果你这时再emulaor 也同样是看不到效果的,因为你修改完还没有编译,和上面修改图片一样,make snod一下

  

  然后和图上一样,你就会生成新的system.img,当然你之前添加的poweron.wav也会自动被编译进去了

  

  然后再修改bootanimation_main.cpp这个文件,因为方法也申明了,也实现了,就是还没有调用,所以调用就在这里调

//play boot music -yp 
BootAnimation *animation = new BootAnimation(); 
animation->bootMusic();

  修改完这写以后还需要修改Android.mk文件

  因为播放声音还需要引入库

  LOCAL_SHARED_LIBRARIES := \

  libcutils \

  libutils \

  libbinder \

  libui \

  libskia \

  libEGL \

  libGLESv1_CM \

  libgui \

  libmedia

  请注意,libmedia是新添加的;

  完事后就ok了,当然还是需要编译的

  mmm frameworks/base/cmds/bootanimation/

  make snod

  大功告成,这样你就成功的添加了开机音乐

  也许有人会问,那android系统自带的那些音乐和铃声在什么地方呢?

  源码目录在framworks/base/data/sounds

  至于编译完成后放到什么地方了那是Android.mk文件上配置的

  不过这里叫AllAudio.mk

  

  我们可以看到他又包含了很多mk文件,在同一目录下就可以找到,上图中就可以,我们随便打开一个看看

  

  这下你们顿时明白了吧,这些资源编译后都去了神马地方

  所以,在刚才添加poweron.wav的时候,其实可以直接把声音资源丢到framworks/base/data/sounds这个目录下

  然后再mk文件中这样修改:

  $(LOCAL_PATH)/poweron.wav:system/etc/poweron.wav \

  不用我说,当然是执行mmm还有make snod命令了

  其实还有一种办法,如果你不想这么麻烦,你可以之际把poweron.wav 文件丢到./frameworks/base/core/res/assets/sounds下,用的时候怎么用呢?

  加载的时候路径是什么呢?我们看看源码

  我们可以看到之前我们修改的那两张图片是怎么被加载进来的

  

  而这个方法的两个参数是:

  

  是不是顿时又明白了?

  原来精髓所在是有个Asset可以使用,这个和上层开发中是一样的,这个文件夹中的东西是不编译的。

Asset* asset = assets.open(name, Asset::ACCESS_BUFFER); 
if (!asset) 
return NO_INIT; 
SkBitmap bitmap; 
SkImageDecoder::DecodeMemory(asset->getBuffer(false), asset->getLength(), 
&bitmap, SkBitmap::kNo_Config, SkImageDecoder::kDecodePixels_Mode); 
asset->close(); 
delete asset;
所以按照这个方法就可以找到poweron.wav 这个文件了,然后修改下bootMusic的代码就可以了。








本文转自 wws5201985 51CTO博客,原文链接:http://blog.51cto.com/wws5201985/800158,如需转载请自行联系原作者
目录
相关文章
|
15天前
|
Java API 调度
Android系统 自定义开机广播,禁止后台服务,运行手动安装应用接收开机广播
Android系统 自定义开机广播,禁止后台服务,运行手动安装应用接收开机广播
40 0
|
15天前
|
安全 Shell Android开发
Android系统 init.rc开机执行shell脚本
Android系统 init.rc开机执行shell脚本
39 0
|
1天前
|
Linux Android开发
Android开机不显示bootloader界面
Android开机不显示bootloader界面
5 0
Android开机不显示bootloader界面
|
1天前
|
Java Android开发 开发者
Android10 修改开发者选项中动画缩放默认值
Android10 修改开发者选项中动画缩放默认值
7 0
|
1天前
|
XML Java Android开发
android的三种动画
android的三种动画
7 0
|
2天前
|
Java Android开发
Android 开机动画的启动
Android 开机动画的启动
8 0
|
16天前
|
Java Android开发
Android Mediatek 延迟停止启动动画和通知SurfaceFlinger(Android正在启动)
Android Mediatek 延迟停止启动动画和通知SurfaceFlinger(Android正在启动)
13 0
|
16天前
|
Java Android开发
Android Mediatek 禁用 USB 权限请求和声音提示 & 解决USB HID设备不识别问题(附带USB调试过程)
Android Mediatek 禁用 USB 权限请求和声音提示 & 解决USB HID设备不识别问题(附带USB调试过程)
12 0
|
1月前
|
Java Android开发
Android开发之使用OpenGL实现翻书动画
本文讲述了如何使用OpenGL实现更平滑、逼真的电子书翻页动画,以解决传统贝塞尔曲线方法存在的卡顿和阴影问题。作者分享了一个改造后的外国代码示例,提供了从前往后和从后往前的翻页效果动图。文章附带了`GlTurnActivity`的Java代码片段,展示如何加载和显示书籍图片。完整工程代码可在作者的GitHub找到:https://github.com/aqi00/note/tree/master/ExmOpenGL。
Android开发之使用OpenGL实现翻书动画
|
4月前
|
XML 开发工具 Android开发
Android动画效果-更新中
Android动画效果-更新中
59 1