Android修改开关机动画声音_第1页
Android修改开关机动画声音_第2页
Android修改开关机动画声音_第3页
Android修改开关机动画声音_第4页
Android修改开关机动画声音_第5页
已阅读5页,还剩14页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、-作者xxxx-日期xxxxAndroid修改开关机动画声音【精品文档】开机画面,按照国际惯例,一般是分为2屏,当然也有3屏的说法,不管怎样,我这里说得就是最后的一屏,按照bootanimation的字面意思翻译,大概也就是开机动画的意思,那这就不说第几屏了,直接用“开机动画”这词。首先,开机动画的地址:systemmediabootanimation.zip。要修改开机动画就是修改bootanimation这个文件。如果说你的手机里没有这个文件,那就是说明你用的是官方原始版本的rom,开机动画没有被修改过,但这不碍事,没有就放一个进去,到时候想换回最原始的开机画面,也可以把bootanima

2、tion这个文件删了。官方最原始的开机动画在system frameworkframework-res.apkassetsimages里面,里面主要是2张图片,高手面可以去研究一下,说不定通过这个文件可以用代码实现动画的过程。接下来,说说bootanimation.zip这个文件的结构。bootanimation里面主要包含一个desc.txt以及N个文件夹。而文件夹里面放着的就是你要的开机动画的图片。decs.txt的作用就是指导系统如何去执行你的开机画面。下面继续说说desc.txt这个文档要怎么写。先看例子,如果我的开机动画要用到2个文件夹,分别是part1和part2,。我希望开机的时

3、候,先把part1里面的图片都播放一遍,然后再循环播放part2里面的文件,直到进入系统。那么decs.txt文档的内容应该如下:302 480 5p 1 0 part1p 0 0 part2就这么多,现在解释一下这些命令吧。第一行,320 480是代表你屏幕的分辨率,因为我们的胖6是320*480的,这就不多说了。后面的5是说,5帧每秒,不懂的可以这么理解,5是代表一秒钟播放5张图片。就这么简单。第二行,p 1 0 part1。p应该是play吧,也就是播放的意思。1是播放一次。0是空指令,就是什么都不做。part1就是说,这条指令是针对part1这个文件夹的。整条指令的意思就是,播放par

4、t1里面的图片1次,然后什么都不做,马上进入下一条指令。第三行,p 0 0 part2。p依然是播放。第一个0这里是代表循环播放,第二个0和上面第二条指令一样,代表什么也不做。part2也就不多说了。至于为什么第一个0为什么是代表循环,只能这么说,这事国际惯例,就像用迅雷的时候,0代表不限制速度一样,系统规定的,你知道就好,别纠结。总结公式如下第一条指令:屏幕的分辨率(空格)播放频率第二条指令:p(空格)播放次数(空格)后续操作(空格)作用文件夹第三条指令:同上第N条指令:同上屏幕分辨率的格式是:宽(空格)高,胖6的就是320 480。播放频率,上面已经说清楚了,至于到底要用多大的数字,视你开

5、机动画的张数而定,比如说,一共有100张图片,开机时间是20秒,那么100/20就是5。播放次数,1是代表一次,0代表循环播放。如果要播放2次的话,就是就是打个2上去,应该是这样吧,反正我是没试过,只试过0和1.后续操作,0代表什么都不做,直接进入下一条指令。10是代表稍作停顿。至于文件夹里面的图片,比较简单,首先,纠正一个说法,之前说必须要是png格式,经过我试验证明,jpg格式的也可以,其他的有待试验,不过只支持静态图片这点应该是真的,动态图片同样有待试验。其次,关于图片的尺寸,是不做要求的,只要在txt文档里写好手机的分辨率即可,开机的时候系统会自动适配。其其次要按播放循序命名,建议用5

6、位数字,比如说,第一张图片是00010,第二张就是00020.。为什么要从00010开始,而不是00001?因为这事预防以后要在第一张和第二张中间再插一张图片进去的话,就可以把插进去的图片命名为00011,在00010之后,00020之前。就这么简单。至于图片那里来嘛,当然是自己网上找啦,也可以下载别人的bootanimation,然后修改一下。最后就是压缩包了,把需要用到的part文件夹跟decs.txt打包成zip格式,必须是zip,不能是rar,而且打包的时候压缩方式要选择“存储”模式。然后改名成为bootanimation.zip,复制到SD卡里,再通过RE文件管理器复制到system

7、media下面,重启。要注意一下,bootanimation不能太大,大了会卡,一般不要超过3M,。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/bootanimatio

8、n.zip或/system/media/bootanimation.zip里面的png图片以动画的形式播放出来。首先,我们先来分析一下源码:首先看一下定义的常量:1234#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.zipBoot

9、Animation:readyToRun()进入一个if判断语句1234567891011if(encryptedAnimation &(access(SYSTEM_ENCRYPTED_BOOTANIMATION_FILE, R_OK) =0) &pen(SYSTEM_ENCRYPTED_BOOTANIMATION_FILE) =NO_ERROR) |(access(USER_BOOTANIMATION_FILE, R_OK) =0) &(mZip.open(USER_BOOTANIMATION_FILE) =NO_ERROR) |(access(SYSTEM_BOOTANIMATION_FI

10、LE, R_OK) =0) &(mZip.open(SYSTEM_BOOTANIMATION_FILE) =NO_ERROR) mAndroidAnimation =false;BootAnimation:threadLoop()12345if(mAndroidAnimation) r =Android(); /执行android字体闪动的图片 else1我们下载的源码里默认是没有那些个.zip动画的,所以总会跳到android字体闪动的画面所以如果你系那个用.zip的动画那么把你做好的动画拷贝到编译好对应的目录下即可,然后执行make snod整合进img包就可以看到效果了如果你想修改and

11、roid闪动的那两张图片的话,最简单的方法是直接替换图片,如果你懂openGL的话也可以自己做酷炫的动画那两张图片放在./frameworks/base/core/res/assets/images 目录下,一张镂空的android图,一张发光效果,动画效果就是下面那张发光的效果图不断左右移动。我是用Photoshop直接修改的修改完后直接替换,然后再 mmm frameworks/base , make snod 即可以下是我修改后的效果图:看样子还想那么回事接下来我们给系统添加开机声音由于动画是在BootAnimation播放的,所以我们的声音肯定也在这个类中做,照猫画虎12#includ

12、e #include 添加方法 void bootMusic();然后在BootAnimation.cpp中实现这个方法:123456789101112131415void BootAnimation:bootMusic()intindex;MediaPlayer*mp =new MediaPlayer();if(mp-setDataSource(/system/etc/poweron.wav, NULL) =NO_ERROR) mp-setAudioStreamType(AUDIO_STREAM_ENFORCED_AUDIBLE);mp-prepare();AudioSystem:getSt

13、reamVolumeIndex(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这个目录对应的

14、是我们编译后out文件夹下的xxx,然后在system/etc,所以你把poweron.wav放到这里就行了,当然如果你这时再emulaor 也同样是看不到效果的,因为你修改完还没有编译,和上面修改图片一样,make snod一下然后再修改bootanimation_main.cpp这个文件,因为方法也申明了,也实现了,就是还没有调用,所以调用就在这里调123/play boot music -ypBootAnimation *animation =new BootAnimation();animation-bootMusic();因为播放声音还需要引入库LOCAL_SHARED_LIBRAR

15、IES := libcutils libutils libbinder libui libskia libEGL libGLESv1_CM libgui libmedia请注意,libmedia是新添加的;完事后就ok了,当然还是需要编译的mmm frameworks/base/cmds/bootanimation/make snod大功告成,这样你就成功的添加了开机音乐也许有人会问,那android系统自带的那些音乐和铃声在什么地方呢?源码目录在framworks/base/data/sounds我们可以看到他又包含了很多mk文件,在同一目录下就可以找到,上图中就可以,我们随便打开一个看看这

16、下你们顿时明白了吧,这些资源编译后都去了神马地方所以,在刚才添加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下,用的时候怎么用呢?加载的时候路径是什么呢?我们看看源码我们可以看到之前我们

17、修改的那两张图片是怎么被加载进来的而这个方法的两个参数是:是不是顿时又明白了?原来精髓所在是有个Asset可以使用,这个和上层开发中是一样的,这个文件夹中的东西是不编译的。12345678Asset*asset =assets.open(name, Asset:ACCESS_BUFFER);if(!asset)returnNO_INIT;SkBitmap bitmap;SkImageDecoder:DecodeMemory(asset-getBuffer(false), asset-getLength(),&bitmap, SkBitmap:kNo_Config, SkImageDecoder

18、:kDecodePixels_Mode);asset-close();delete asset;所以按照这个方法就可以找到poweron.wav 这个文件了,然后修改下bootMusic的代码就可以了。原创文章,转载请注明出处,谢谢。系统通常默认支持开机动画,开机关机铃声服务倒是预先定义了,不过使用时需要在/sysytem/media/下添加相应的音频文件。长按Power键弹出关键选项,关机时也只是显示进度条,而不是我们期望的关机动画同时伴有关机铃声,当然在做二次开发的时候,这些都是可以定制的。下面将逐步分析如何实现这些定制化的需求。一.制作开机动画开机画面是保存在/system/media的

19、bootanimation.zip,下面分析系统开机画面的构成文件名为bootanimation.zip一定是这个不能修改,里面包含part1 part2文件夹 和desc.txt,part文件夹里面放的是动画拆分的图片,格式为png,desc.txt里面是播放的设置。格式是这样的480 800 15p 1 0 part0p 0 0 part1480 800是指显示的分辨率 宽 高15是一秒的帧数p后面的数字是指播放次数0为循环,N为播放N次后面那位数字 一般为0(空指令),表示播放一遍后稍作停顿的时间part0,part1为文件夹名一般我们只使用part0目录图片准备好了,desc.txt里

20、面的命令也准备好了,就可以把他们一起打包压缩成zip格式了。记住,是zip格式,而不是rar格式。另外压缩的时候注意一点,压缩的时候压缩方式要选择存储,否则开机时手机会不认的。当然不至于变砖,只是开机的时候会黑着没动画一直到进入桌面为止。开机动画的替换也很简单,我们把做好的bootanimation.zip替换掉原来的/system/media/bootanimation.zip文件即可。关机动画其实和开机动画的制作一样,我们命名为shutdownanimation.zip,和bootanimation.zip放在同一目录下。二.开关机动画实现原理Android系统在init.rc中定义了很多

21、Servic,具体定义格式可以参考Android Platform Developers Guide中的“Android Init Language”。Init.rc中定义的Service将会被Init进程创建,其中已经定义的服务就包含了开机动画,但没有关机动画的定义service bootsound /system/bin/mplayer /system/media/bootsounduser mediagroup audiooneshot/开机铃声服务/system/media/startupsound是铃声文件service startupsound /system/bin/mplaye

22、r /system/media/startupsounduser mediagroup audiodisabledoneshot/关机铃声服务/system/media/shutdownsound是关机铃声service shutdownsound /system/bin/mplayer /system/media/shutdownsounduser mediagroup audiodisabledoneshot/定义了一个bootanim的服务,对应执行/system/bin/bootanimation/disabled表示init进程创建只是创建它,但不立刻执行/oneshot表示该服务只

23、执行一次service bootanim /system/bin/bootanimationuser graphicsgroup graphicsdisabledoneshot当android系统boot时,开始加载动画和开机铃声,其代码位于status_t SurfaceFlinger:readyToRun() / start boot animation serviceproperty_set(ctl.start, bootanim);/注char valuePROPERTY_VALUE_MAX;property_get(file.silent, value,

24、 0);if (atoi(value)= 0)LOGI(start:file.silent is soundable);/ start startupsound serviceproperty_set(ctl.start,startupsound);/注 else LOGI(start:file.silent is silent);return NO_ERROR;当Android完成boot后,关闭动画和开机铃声,代码位于void SurfaceFlinger:bootFinished() const nsecs_t now = sy

25、stemTime();const nsecs_t duration = now - mBootTime;LOGI(Boot is finished (%ld ms), long(ns2ms(duration) );mBootFinished = true;/stop bootanim serviceproperty_set(ctl.stop, bootanim);char valuePROPERTY_VALUE_MAX;property_get(file.silent, value, 0);if (atoi(value)= 0)LOGI(stop:persist.

26、file.silent is soundable);/stop startupsound serviceproperty_set(ctl.stop,startupsound); else LOGI(stop:file.silent is silent);如何理解ctr.start和ctr.stop系统属性?每一项服务必须在/init.rc中定义.Android系统启动时,init守护进程将解析init.rc和启动属性服务,属性“ ctl.start ”和“ ctl.stop ”是用来启动和停止服务的。一旦收到设置“ ctrl.start ”属性的请求

27、,属性服务将使用该属性值作为服务名找到该服务,启动该服务。这项服务的启动结果将会放入“ init.svc.“属性中。客户端应用程序可以轮询那个属性值,以确定结果。想更深入了解Android property系统可以参考博文(翻译)Android属性系统。property_set(ctl.start,ServiceName);就是启动ServiceName服务(在init.rc中定义);property_set(ctl.stop,ServiceName)相对的是关闭ServiceName服务。A启动动画服务由于开机动画和关机动画除了播放的动画文件不同,其他的完全一致,这里重复利用/system/

28、bin/bootanimation代码,仿照开机动画服务,我们新定义关机动画service shutdownanim /system/bin/bootanimation -shutdownuser graphicsgroup graphicsdisabledoneshot唯一要注意的是关机动画使用的/system/bin/bootanimation带了-shutdown参数,这个参数用来区分加载的动画文件为开机还是关机动画。当bootanimation服务启动时,进入/frameworks/base/cmds/bootanimation/bootanimation_main.cpp主函数mai

29、n,int main(int argc, char* argv)#if defined(HAVE_PTHREADS)setpriority(PRIO_PROCESS, 0, ANDROID_PRIORITY_DISPLAY);#endifchar valuePROPERTY_VALUE_MAX;property_get(debug.sf.nobootanimation, value, 0);int noBootAnimation = atoi(value);LOGI_IF(noBootAnimation,boot animation disabled);if (!noBootAnimation

30、) sp proc(ProcessState:self();ProcessState:self()-startThreadPool();/ create the animation objectsp boot = new BootAnimation();/根据是否有参数,来设置动画对象的isShutdown属性if (argc 1) if (strcmp(argv1, -shutdown)=0) boot-isShutdown(true);IPCThreadState:self()-joinThreadPool();return 0;new BootAnimation();时,如果有参数-sh

31、utdown,则boot-isShutdown(true);方法isShutdown和isShutdown使我们新加的,所以先要在frameworks/base/cmds/bootanimation/bootanimation/BootAnimation.h头文件中申明为public,如下:class BootAnimation : public Thread, public IBinder:DeathRecipientpublic:BootAnimation();virtualBootAnimation();sp session() const;boolmShutdown;voidisShu

32、tdown(bool shutdown);.之后修改/首先在构造函数中初始化mShutdown = false;表示默认是开机标志BootAnimation:BootAnimation() : Thread(false)mSession = new SurfaceComposerClient();mShutdown = false;实现isShutdown(bool shutdown);方法void BootAnimation:isShutdown(bool shutdown)mShutdown = shutdown;修改status_t BootAnimation:readyToRun()方

33、法来根据mShutdown值加载动画文件,如status_t BootAnimation:readyToRun() mAndroidAnimation = false;if (!mShutdown) status_t err = mZip.open(/data/local/bootanimation.zip);if (err != NO_ERROR) err = mZip.open(/system/media/bootanimation.zip);if (err != NO_ERROR) mAndroidAnimation = true;else status_t err = mZip.ope

34、n(/data/local/shutdownanimation.zip);if (err != NO_ERROR) err = mZip.open(/system/media/shutdownanimation.zip);if (err != NO_ERROR) mAndroidAnimation = true;mShutdown = false;return NO_ERROR;以上是动画定制化C代码部分的全部修改。B启动开机铃声服务startupsound开机铃声服务,shutdownsound关机铃声服务init.rc定义,service startupsound /system/bin/

35、mplayer /system/media/startupsound相当于用/system/bin/mplayer对象播放媒体文件/system/media/startupsound,init.rc定义,service shutdownsound /system/bin/mplayer /system/media/shutdownsound相当于用/system/bin/mplayer对象播放媒体文件/system/media/ shutdownsound.到这里,开机动画和开机铃声是正常的,我们还需要修改的是关机时候的执行流程,因为默认的操作时关机确认后显示进度条。C定制Android关机过

36、程在Android系统中,长按Power键默认会弹出对话框让你选择“飞行模式”,“静音”,“关机”等功能。我的目标是长按Power键,将会关机,弹出“设备将要关机”选择对话框。如果可以选择“是”关机,和“否”返回系统。弹出对话框的代码位于:长按Power键显示对话框的代码如下:Runnable mPowerLongPress = new Runnable() public void run() mShouldTurnOffOnKeyUp = false;performHapticFeedbackLw(null, HapticFeedbackConstants.LONG_PRESS, false

37、);sendCloseSystemWindows(SYSTEM_DIALOG_REASON_GLOBAL_ACTIONS);showGlobalActionsDialog();调用showGlobalActionsDialog方法将会显示上面提到的显示“飞行模式”,“静音”,“关机”,选项的对话框。关机的代码位于:文件的createDialog方法中,有如下代码:mItems = Lists.newArrayList(/ silent modemSilentModeToggle,/ next: airplane modemAirplaneModeOn,/ last: power offnew

38、SinglePressAction(ernal.R.drawable.ic_lock_power_off,R.string.global_action_power_off) public void onPress() / shutdown by making sure radio and power are handled accordingly.ShutdownThread.shutdown(mContext, true);public boolean showDuringKeyguard() return true;public boolean showBef

39、oreProvisioning() return true);从代码中我们可以看出,如果选择上述对话框的“关机”选项之后,将会调用ShutdownThread的shutdown方法来关机。shutdown方法的第二个参数标识是否弹出询问对话框。ShutdownThread代码位于shutdown方法中有如下代码public static void shutdown(final Context context, boolean confirm) / ensure that only one thread is trying to power down./ any additional calls

40、 are just returnedsynchronized (sIsStartedGuard)if (sIsStarted) Log.d(TAG, Request to shutdown already running, returning.);return;Log.d(TAG, Notifying thread to start radio shutdown);if (confirm) final AlertDialog dialog = new AlertDialog.Builder(context).setIcon(android.R.drawable.ic_dialog_alert)

41、.setTitle(ernal.R.string.power_off).setMessage(ernal.R.string.shutdown_confirm).setPositiveButton(ernal.R.string.yes,new DialogInterface.OnClickListener() public void onClick(DialogInterface dialog, int which) beginShutdownSequence(context);).setNegativeButton(ernal.R.string.no, null).create();dialog.getWindow().setType(WindowManager.LayoutParams.TYPE_KEYGUARD_DIALOG);if (!context.getResources().getBoolean(ernal.R.bool.config_sf_slowBlur) dialog.getWindow().addFlag

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论