zoukankan      html  css  js  c++  java
  • [转]android4.0.3 修改启动动画和开机声音

    本文转自:http://www.cnblogs.com/jqyp/archive/2012/03/07/2383973.html

    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

    首先看一下定义的常量:

    1
    2
    3
    4
    #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判断语句

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    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()

    1
    2
    3
    4
    5
    if (mAndroidAnimation) {
    r = Android(); // 执行android字体闪动的图片
    } else {
    r = movie(); // 执行bootanimation.zip中提供的动画图片
    }
    1

    ==> 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 即可

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

    image

    看样子还想那么回事

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

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

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

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

    image

    添加方法 void bootMusic();

    image

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

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    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一下

    image

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

    image

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

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

    image

    修改完这写以后还需要修改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

    image

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

    image

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

    所以,在刚才添加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下,用的时候怎么用呢?

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

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

    image

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

    image

    是不是顿时又明白了?

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

    1
    2
    3
    4
    5
    6
    7
    8
    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的代码就可以了。

  • 相关阅读:
    A1066 Root of AVL Tree (25 分)
    A1099 Build A Binary Search Tree (30 分)
    A1043 Is It a Binary Search Tree (25 分) ——PA, 24/25, 先记录思路
    A1079; A1090; A1004:一般树遍历
    A1053 Path of Equal Weight (30 分)
    A1086 Tree Traversals Again (25 分)
    A1020 Tree Traversals (25 分)
    A1091 Acute Stroke (30 分)
    A1103 Integer Factorization (30 分)
    A1032 Sharing (25 分)
  • 原文地址:https://www.cnblogs.com/freeliver54/p/2568970.html
Copyright © 2011-2022 走看看